繁体   English   中英

我们如何才能做到真正的Rails 3多态has_many:through?

[英]How can we do genuine rails 3 polymorphic has_many :through?

我想要以下内容:

class Foo < AR
  has_many :taggings
  has_many :tags, :through => :taggings
end

class Bar < AR
  has_many :taggings
  has_many :tags, :through => :taggings
end

class Tagging < AR
  belongs_to :tag
  belongs_to :taggable, :polymorphic => true
  belongs_to :user # etc
end

class Tag < AR
  has_many :taggings
  has_many :taggables, :through => :taggings
end

Tag.first.taggables # => [Bar:43, Foo:52, Foo:59, Bar:59, Foo:123, ...]

特别是,我希望有指定Tag.foo_taggablesTag.bar_taggables ,等等-这就是:源/:在相关的问题提到SOURCE_TYPE方法,和它吮吸。

我希望它能够与各种不同的对象一起正常工作。 是的,我意识到它们不会都具有相同的属性。 这应该是很好(我应该能够仅仅依靠任何接口的所有taggables 份额,而不关心我处理哪种用)。

特别是,例如tag.taggable_ids可能必须是id / type元组的数组,而不仅仅是int id的数组。

我在这里以标记为例-我的实际问题有不同的场景,但相同的本质问题是多态has_many:through。

在Rails 2中,有一个has_many_polymorphs插件可以完成此任务,但是已经不存在了。 克朗的叉子似乎不起作用。 在Rails 3中有可用的方法吗?

如果您不需要#build ,不希望使用.include或类似的东西来加载它,则可以使用简单的方法来代替关联:

class Tag < AR
  has_many :taggings

  def taggables
    taggings.includes(:taggables).flat_map(&:taggables).uniq
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM