随着Rails 3的推出,我想知道是否有一种新的方式来做一个has_many:通过与多态模型的关联?如果不是最好的方式是什么?
这是我正在使用的
class Page < ActiveRecord::Base
end
class Text < ActiveRecord::Base
end
class Picture < ActiveRecord::Base
end
文本和图片是属于一个或多个页面的内容 - 每个页面都有一个或多个内容元素(文本或图片)。我希望能够做到这一点:
page.content => ["text item 1", "text item 2", "picture 1"]
picture.pages => ["page 3", "page 7"]
正如我上面提到的,我正在使用Rails 3.任何想法?
答案 0 :(得分:1)
Rails 3和2没有区别。
class Page < ActiveRecord::Base
belongs_to :text # foreign key - text_id
belongs_to :picture # foreign key - picture_id
end
class Text < ActiveRecord::Base
has_many : pictures
has_many :pictures, :through => :pages
end
class Picture < ActiveRecord::Base
has_many :assignments
has_many :texts, :through => :pages
end
第二个想法
你的上一条评论让我觉得你可能有大量的content_types,或者更多,content_types可能会在客户端生成。
这是一个替代方案,为什么不制作一个模型,Page - 并使其具有反映其content_type的属性。然后你可以这样与他们建立关系..
@show_texts = Page.find(:all).select{ |p| p.text != nil }.collect{|p| p.id}.inspect
依此类推......只是一个想法。老实说,我会尝试重构上面的代码以获得SQL友好版本,因为这有很多方法可以使用。
答案 1 :(得分:1)
我会使用HMT和STI:
class Page < ActiveRecord::Base
has_many :assets, :through => :page_components
def content
self.assets
end
end
class PageComponent < ActiveRecord::Base
# could also use HABTM
belongs_to :page
belongs_to :asset
end
class Asset < ActiveRecord::Base
has_many :pages, :through => :page_components
end
class Text < Asset
# inherits .pages association method from Asset
end
class Picture < Asset
# so does this.
end
# class Video < Asset...