有没有办法在Rails中使用ActiveRecord将一组基元(例如String,Fixnum而不是自定义对象)分配给对象?

时间:2011-07-07 02:23:48

标签: ruby-on-rails activerecord

我想在活动记录对象上调用属性的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

2 个答案:

答案 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"]