Я знаю, что к этой теме уже подходили несколько раз, но я не смог обобщить другие вопросы, чтобы удовлетворить этот конкретный вариант использования для Rails 3:
Я пытаюсь построитьмодель данных, в которой есть вложения и вложения.Любое приложение может быть связано с приложением, и наоборот.Я бы хотел, чтобы это в конечном итоге использовалось как плагин actions_as комбинации (acts_as_attachable и acts_as_attachment).
Моя текущая схема использует модель Attacher с двумя полиморфными отношениями own_to, чтобы попытаться выполнить это.
Конкретный случай, описанный здесь, включает модель Attachable (Good) и две модели Attachment (Image and 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
фильма.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, поэтому, пожалуйста, дайте мне знать, если я могу что-нибудь сделать, чтобы улучшить свой вопрос.Заранее спасибо!:)