Как построить эксклюзивный запрос IN, используя Ruby и ActiveRecord? - PullRequest
2 голосов
/ 21 июня 2011

ОБНОВЛЕНО / ИЗМЕНЕНО для уточнения:

В моем объекте AR для блога определено следующее

  scope :with_tag_tokens, lambda {|name_tokens| 
    joins(:tags).where(:tags => {:name_token => name_tokens}) unless name_tokens.empty?
  }

Принимая во внимание, что следующий запрос вернет все блоги с тегами, которые имеют "name_token"Атрибут равен 1 ИЛИ 3 ИЛИ 5 (если я, конечно, передал [1,3,5]) ... Я хочу знать, есть ли способ создать аналогичный запрос, который бы возвращал только блоги, которые связаны только сТеги с "name_tokens" из 1 И 3 И 5.

Другими словами ... Я хочу вернуть Блог A, только если он связан с Тегом 1 и Тегом 3 и Тегом 4.

Спасибо -wg

1 Ответ

1 голос
/ 21 июня 2011

Является ли это эффективным способом справиться с этим ... это работает

tags = ['rails', 'ruby']
BlogEntry.joins(:tags).where(:tags => {:name_token => tags}).group(BlogEntry.column_names.map {|c| BlogEntry.table_name + "." + c }.join(',')).having("count(#{BlogEntry.table_name + '.id'}) =#{tags.count}")

Что ты подумаешь?Есть ли способ лучше?Возможно, правильное решение - это правильный подход ... если это так, мне определенно интересно услышать от других хорошее или плохое.

* ОБНОВЛЕНИЕ * Вот чтоsql выглядит в случае, если люди заинтересованы:

SELECT \"blog_entries\".* 
FROM \"blog_entries\" 
     INNER JOIN \"blog_entries_tags\" ON \"blog_entries_tags\".\"blog_entry_id\" = \"blog_entries\".\"id\" 
     INNER JOIN \"tags\" ON \"tags\".\"id\" = \"blog_entries_tags\".\"tag_id\" 
WHERE \"tags\".\"name_token\" IN ('grace', 'gratitude') 
GROUP BY id 
HAVING count(blog_entries.id) =2 
ORDER BY published_at DESC, title, created_at DESC

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...