1

找到没有标签的条目的正确方法是什么?

我尝试使用Entry.tagged_with(nil),但它只返回一个空哈希。

我需要它,所以我可以列出我仍然需要标记的条目。

谢谢。

4

4 回答 4

5

以下似乎对我有用:

Entry.includes("taggings").where("taggings.id is null")

这也应该支持链接。例如,以下应该有效:

Entry.includes("taggings").where("taggings.id is null").where(foo: "bar")
于 2013-09-06T09:15:05.777 回答
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 模型,但不能与其他范围链接。

于 2013-05-21T04:04:16.407 回答
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)
}

对于庞大的数据集,它可能效率不高,但它适合我的目的。

于 2012-03-05T20:53:28.150 回答
0

在不了解acts-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 然后保存任何未标记的条目。

于 2011-01-01T15:55:55.840 回答