必须有更好的方法来做到这一点。说我有:
class SomeModel < ActiveRecord::Base
has_many :taggings
has_many :tags, through: :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :some_model
belongs_to :tag
end
class Tag
# Attributes:
# - name:string
# - is_bad:boolean
has_many :taggings
has_many :some_models, through: taggings
end
有些标签不好,有些标签不是。
我想在SomeModel scope :not_bad
上使用一个范围,以便我得到任何不具有任何不良标记的SomeModel(is_bad == true)。
乍一看:
SomeModel.joins(taggings: :tag).where('tags.is_bad = FALSE')
找到所有已标记 SomeModels而没有错误标记。当然。但是没有标记的SomeModels呢?它们并不坏......至少现在还没有。我需要尝试包含,以查找没有标记的记录:
SomeModel.includes(taggings: :tag).where('tags.is_bad = FALSE')
不起作用,错误。查看生成的SQL表明我根本没有得到连接语句。我阅读了一些文档并查看了参考文献,给了我:
SomeModel.includes(taggings: :tag).where('tags.is_bad = FALSE').references(taggings: :tag)
哪个运行,但只是重现连接的输出......
此刻,我离开了这个功能性但可怕的:
SomeModel.where.not(id: SomeModel.joins(taggings: :tag).where('tags.is_bad = TRUE').pluck(:id))
需要多次查询,感觉很可怕。
我知道必须有一个很好的方法来做到这一点,我在这里缺少什么?