找到没有标签的条目的正确方法(tm)是什么?
我尝试使用Entry.tagged_with(nil)
但它只返回一个空哈希。
我需要它,所以我可以列出我仍然需要标记的条目。
感谢。
答案 0 :(得分:5)
以下似乎对我有用:
Entry.includes("taggings").where("taggings.id is null")
这也应该支持链接。例如,以下内容应该有效:
Entry.includes("taggings").where("taggings.id is null").where(foo: "bar")
答案 1 :(得分:3)
以下是我找到已标记和未标记照片的解决方案。
scope :with_taggings, where('id in (select taggable_id from taggings where taggable_type = ’Photo‘ and context = ’bibs‘)')
scope :without_taggings, where('id not in (select taggable_id from taggings where taggable_type = ’Photo‘ and context = ’bibs‘)')
但它适用于Photo模型,但不能与其他范围链接。
答案 2 :(得分:2)
我意识到这很古老但我今天也遇到了类似的需求。我只是用一个简单的多查询范围来完成它:
scope :untagged, lambda {
# first build a scope for the records of this type that *are* tagged
tagged_scope = Tagging.where(:taggable_type => base_class.to_s)
# only fetching the taggable ids
tagged_scope = tagged_scope.select('DISTINCT taggable_id')
# and use it to retrieve the set of ids you *don't* want
tagged_ids = connection.select_values(tagged_scope.to_sql)
# then query for the rest of the records, excluding what you've found
where arel_table[:id].not_in(tagged_ids)
}
对于大型数据集可能效率不高,但它适合我的目的。
答案 3 :(得分:0)
如果不知道act-as-taggable-on的内部结构,我就不会想到一种不涉及循环查询或原始SQL的简洁方法。这是可读的:
need_to_tag = []
Entry.all.each do |e|
need_to_tag << e if e.tag_list.blank?
end
然后need_to_tag保存任何未标记的条目。