Has_many通过关联多态性错误

时间:2010-09-07 00:22:49

标签: ruby-on-rails

随着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.任何想法?

2 个答案:

答案 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...