как найти записи без тегов, используя действия с тегами?

Как правильно (tm) найти записи без тегов?

Я пытался использовать Entry.tagged_with(nil), но он просто возвращает пустой хэш.

Мне это нужно, чтобы я мог перечислить записи, которые мне еще нужно пометить.

Спасибо.


person Yo'av Moshe    schedule 01.01.2011    source источник


Ответы (4)


Не зная внутренностей действий-как-тегов, я не могу придумать изящного способа, который не включал бы циклические запросы или необработанный SQL. Это читабельно:

need_to_tag = []

Entry.all.each do |e|
  need_to_tag << e if e.tag_list.blank?
end

Затем need_to_tag содержит все записи без тегов.

person stef    schedule 01.01.2011
comment
Спасибо. Я надеялся, что будет лучший способ, но это, безусловно, тоже работает. - person Yo'av Moshe; 03.01.2011
comment
есть ли лучший метод? это делает один запрос попадающим в базу данных. У меня есть около 5000 записей с тегами, и это неприемлемо. - person David; 28.04.2011
comment
Я думаю, что в этом случае лучшим методом для вас будет использование необработанного SQL-запроса. - person stef; 28.04.2011
comment
... и сервер падает из-за нехватки памяти. В первый раз, когда получите 100 000 записей, и во второй раз, когда need_to_tag будет иметь 50 000 записей. - person antiqe; 10.10.2013

Следующее, кажется, работает для меня:

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

Это также должно поддерживать цепочку. Например, должно работать следующее:

Entry.includes("taggings").where("taggings.id is null").where(foo: "bar")
person Anthony Eden    schedule 06.09.2013

Вот мое решение, чтобы найти фотографии с тегами и без тегов.

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, но не может быть связано с другими областями.

person Xiao Bin    schedule 21.05.2013
comment
Два замечания: а) Вы должны использовать single ' в коде SQL. MySQL обрабатывает ' и ​​'' одинаково, но другие базы данных (например, Postgresql) этого не делают. б) Не играя с этим - почему этот код нельзя связать? - person radiospiel; 29.05.2013

Я понимаю, что это старо, но сегодня я столкнулся с подобной потребностью. Я просто сделал это с помощью простой области с несколькими запросами:

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)
}

Это может быть неэффективно для огромных наборов данных, но подходит для моих целей.

person numbers1311407    schedule 05.03.2012