我有以下模特:
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
更好的方法?
答案 0 :(得分:2)
这应该有效:
Topic.joins(:tags).where(tags: {status: Tag::STATUS_ENABLED}).group("topics.id")
这适用于内部联接。它比你的tags.map(&:topics).flatten
解决方案要好得多。 map + flatten每个启用的标记查询数据库一次。这样,它只有1个查询。