通过关系轨道获取所有元素?

时间:2014-12-28 17:59:11

标签: ruby-on-rails-4 has-many-through

我有以下模特:

class Topic < ActiveRecord::Base
  has_many :topic_tags
  has_many :tags, through: :topic_tags
end

class Tag < ActiveRecord::Base
  STATUS_DISABLED = 0
  STATUS_ENABLED  = 1

  has_many :topic_tags
  has_many :topics, through: :topic_tags
end

我知道如何获取状态为STATUS_ENABLED的所有标签的所有主题。

我想要像:

Topic.where(tags: {status: Tag::STATUS_ENABLED)

最好的方法是什么?

编辑:

我找到了苛刻的解决方案:

Tag.includes(:topics).where(status: Tag::STATUS_ENABLED).map(&:topics).flatten

更好的方法?

1 个答案:

答案 0 :(得分:2)

这应该有效:

Topic.joins(:tags).where(tags: {status: Tag::STATUS_ENABLED}).group("topics.id")

这适用于内部联接。它比你的tags.map(&:topics).flatten解决方案要好得多。 map + flatten每个启用的标记查询数据库一次。这样,它只有1个查询。