我想在活动记录对象上调用属性的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"]
我不想定义“FavouriteSongTitles”类并执行“has_many”和“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
答案 0 :(得分:1)
为什么不添加新方法?你不必那么反对这个框架。
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
最后一个在视图中可以很方便,但可能不是你想要的。
答案 1 :(得分:0)
我不知道如何让AR知道没有相关模型类的表。
另一种方法可能是序列化(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"]