我知道这个主题以前已经以各种方式讨论过几次了,但是我还没有能够综合其他问题来满足Rails 3的这个特殊用例:
我试图构建一个数据模型,其中有附件和附件。任何附件都可以与附件连接,反之亦然。我希望这最终被用作组合acts_as插件(acts_as_attachable和acts_as_attachment)。
我当前的模式使用带有两个多态belongs_to关系的Attacher模型来尝试完成此任务。
这里概述的具体案例涉及一个Attachable模型(Good)和两个Attachment模型(Image和Movie)。
到目前为止我写的是:
attacher.rb
class Attacher < ActiveRecord::Base
belongs_to :attachment, :polymorphic => true
belongs_to :attachable, :polymorphic => true
end
good.rb
class Good < ActiveRecord::Base
has_many :attachment_relations, :as => :attachable, :class_name => 'Attacher'
has_many :attached_images, :through => :attachment_relations, :source => :attachment, :source_type => 'Image'
has_many :attached_movies, :through => :attachment_relations, :source => :attachment, :source_type => 'Movie'
end
image.rb
class Image < ActiveRecord::Base
has_many :attachable_relations, :as => :attachment, :class_name => 'Attacher'
end
movie.rb
class Movie < ActiveRecord::Base
has_many :attachable_relations, :as => :attachment, :class_name => 'Attacher'
end
只要我能做到以下几点,它就能工作:
@g = Good.create!
@i = Image.create!
@m = Movie.create!
@g.attached_images << @i
@g.attached_images # [#<Image id: 1 ... >]
@g.attached_movies << @m
@g.attached_movies # [#<Movie id: 1 ... >]
@g.attachment_relations # [#<Attacher id: 1, attachable_id: 1, attachable_type: "Good", attachment_id: 1, attachment_type: "Image" ...>, #<Attacher id: 2, attachable_id: 1, attachable_type: "Good", attachment_id: 1, attachment_type: "Movie" ...>]
我的问题的主旨是:我可以使用关联来构建以下方法/返回,这样我仍然可以做像@g.attachments.where( ... )
这样的事情:
@g.attachments # [#<Image id: 1 ... >, #<Movie id: 1 ... >]
我试过很多这样的事情:
good.rb
class Good < ActiveRecord::Base
has_many :attachment_relations, :as => :attachable, :class_name => 'Attacher'
has_many :attachments, :through => :attachment_relations
end
但是他们倾向于扔给我这个:
ActiveRecord::HasManyThroughAssociationPolymorphicError: Cannot have a has_many :through association 'Good#attachments' on the polymorphic object 'Attachment#attachment'
我想我基本上需要一些可以像source_type => :any
一样的东西…
另外,这是我关于StackOverflow的第一个问题,所以如果有什么我可以做的来改进我的问题,请告诉我。提前感谢!:)
不幸的是,我得出的结论是,没有一种简单或标准的方法来做到这一点。我找到的最清晰的基本解决方案来自Squeegy对这个问题的回答:Rails多态多对多关联,其中他引用了一个相当简单的has_relations模块作为要点。
我认为这基本上回答了我的问题,并为创建更健壮的解决方案提供了一个很好的起点。
遗憾的是,这是真的不可能与rails,你可以试试你的运气与这个扩展:https://github.com/kronn/has_many_polymorphs/tree/
你应该准备好了,只需添加这一行到你的Gemfile:
gem 'kronn-has_many_polymorphs'
并在rails应用程序文件夹中运行此命令:
bundle