1

我想要以下内容:

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_taggables,Tag.bar_taggables等 - 这是相关问题中提到的 :source/:source_type 方法,它很糟糕。

我希望它能够与一组不同的对象正常工作。是的,我意识到它们不会都具有相同的属性。那应该没问题(我应该能够只依赖所有可标记的接口共享的任何接口,而不关心我正在处理哪种接口)

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

我在这里使用标签作为示例——我的实际问题有不同的场景,但多态 has_many :through 的基本问题相同。

在 Rails 2 中,有一个插件 has_many_polymorphs 可以实现这一点,但它已经失效了。Kronn 的叉子似乎不起作用。在 Rails 3 中是否有一种有效的方法来获得它?

4

1 回答 1

0

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

class Tag < AR
  has_many :taggings

  def taggables
    taggings.includes(:taggables).flat_map(&:taggables).uniq
  end
end
于 2012-10-06T03:23:39.617 回答