我们怎么能做真正的rails 3多态has_many:通过?

时间:2012-10-06 02:59:50

标签: ruby-on-rails ruby-on-rails-3 has-many-through polymorphic-associations

我希望得到以下内容:

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 /:source_type方法,它很糟糕。

我希望它能够与一系列不同的对象一起正常工作。是的,我意识到他们不会都拥有相同的属性;这应该没问题(我应该只能依赖所有可识别的共享的界面,而不关心我正在处理的那种)。

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

我在这里使用标签只是作为一个例子 - 我的实际问题有不同的情况,但同样的多态性问题has_many:通过。

在Rails 2中,有一个插件has_many_polymorphs完成了这个,但它已经不存在了。 Kronn's fork似乎不起作用。是否有一种功能正常的方法可以在Rails 3中获得它?

1 个答案:

答案 0 :(得分:0)

如果您不需要#build,请使用.include或任何类似的东西加载它,那么您可以使用简单的方法而不是关联:

class Tag < AR
  has_many :taggings

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