多态 has_many:通过 Rails

Sli*_*k23 1 activerecord ruby-on-rails ruby-on-rails-3

我有一个标签模型,我希望它是多态的,但我不希望“视频”标签有五个记录,例如,我想创建一次标签并能够在各种模型上使用它。我已经在这里准备了一些有关这样做的问题,但我不太明白如何使其发挥作用。

所以我有:

class Tag < ActiveRecord::Base
  belongs_to :tagable, :polymorphic => true

end
Run Code Online (Sandbox Code Playgroud)

class Post < ActiveRecord::Base
  has_many :tags, :through => :tag_assignments

end
Run Code Online (Sandbox Code Playgroud)

class TagAssignment < ActiveRecord::Base
      has_many :tags, :as => :taggable

end
Run Code Online (Sandbox Code Playgroud)

在我看来,这应该可行,但是......阅读这里的所有问题,知道我需要一个:source =>选项将它们连接在一起,但我只是没有完全遵循如何做到这一点。有人可以帮忙吗?

Har*_*tty 5

您必须按如下方式重做模型:

class Tag < ActiveRecord::Base
  has_many :tag_assignments
end

class TagAssignment < ActiveRecord::Base
  belongs_to :tagable, :polymorphic => true
  belongs_to :tag
end

class Post < ActiveRecord::Base
  has_many :tag_assignments, :as => :tagable
  has_many :tags, :through => :tag_assignments
end
Run Code Online (Sandbox Code Playgroud)

现在给定一个帖子,您可以按如下方式获取其标签:

post.tags
Run Code Online (Sandbox Code Playgroud)

笔记

您应该考虑在您的用例中使用acts-as-taggable-on gem。