是否有一种方法来分配一组原语(如字符串,Fixnum,而不是自定义对象)到一个使用ActiveRecord在Rails中



我想在活动记录对象上调用属性的getter方法,并让它返回字符串集合,而不是自定义对象的集合。

person.favourite_song_titles => ["Somewhere over the rainbow","Beat it","Poker face"]

person.favourite_song_titles => [#FavouriteSongTitle name: "Somewhere over the rainbow",#FavouriteSongTitle name:"Beat it",#FavouriteSongTitle name:"Poker face"]

我不想必须定义一个"favoritesongtitles"类,并做"has_many"one_answers"belongs_to",因为没有与这些值相关的行为。

理想情况下,我想要表格:

create_table "people" do | t |
 #some attributes defined here
end
create_table "favourte_song_titles" | t |
  t.column "person_id", :integer
  t.column "value", :string
end

和一些连接语法在我的想象中是这样的:

Class Person < ActiveRecord::Base
  has_many :favourite_song_titles, :class_name => "String", #some config to tell active record which table/column to use
end

为什么不直接添加一个新方法呢?你不需要和框架做太多的斗争。

class Person < ActiveRecord::Base
  has_many :song_titles
  def fav_song_titles
    song_titles.map(&:name)
  end
end

另一个取决于你如何使用它的选项是覆盖歌曲标题类中的to_s方法:

class SongTitle < AR:Base
  def to_s
    name
  end
end

最后一个在视图中很方便,但可能不是您想要的。

如果没有关联的模型类,我不知道如何让AR了解表。

另一种方法可能是serialize (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize)方法:
create_table "people" do | t |
  #some attributes defined here
  t.text :favourite_song_titles
end
Class Person < ActiveRecord::Base
  serialize :favourite_song_titles
  attr_accessor :favourite_song_titles
end

你可以:

person.favourite_song_titles = ["Somewhere over the rainbow","Beat it","Poker face"]
person.save
person.reload
person.favourite_song_titles #  ["Somewhere over the rainbow","Beat it","Poker face"]

最新更新