2013-08-11 3 views
3

Я пытаюсь получить некоторые записи и иметь проблему, когда один из моих параметров является пустым массивом. Я понимаю, почему запрос не возвращает никаких результатов, но я не знаю, как лучше обращаться с ним в рельсах. В моем коде, я звонюRails `NOT IN (null)` не возвращает никаких результатов

@user.trustees.where(["trustees.default = true AND trustees.id NOT IN (?)", trustees.map{ |t| t.id }]) 

Это работает, как ожидалось, когда массив опекуны фактически содержит объекты, однако, когда он не делает, то запрос возвращает ничего, как SQL дали результаты в

SELECT `users`.* 
FROM `users` 
INNER JOIN `trustees` ON `users`.`id` = `trustees`.`trustee_id` 
WHERE `trustees`.`truster_id` = 1 
AND (trustees.default = true 
AND trustees.id NOT IN (NULL)) 

Что является самым простым способом избежать проблемы NOT IN (NULL), что у меня есть?

ответ

6

Вы можете сделать так:

@user.trustees.where(default: true).where.not(id: trustees.map{ |t| t.id }) 
+3

Отлично! Я отправился с '@ user.trustees.where ([" trustees.default = true AND (trustees.id NOT IN (: trustees) ИЛИ: trustees IS NULL) ", {trustees: trustees.map (&: id) }]) ', но это МНОГО очиститель. Cheers: D – PaReeOhNos

+0

@PaReeOhNos: Это преимущество использования правильных тегов версии rails на SO :) – fotanus

+0

Согласен. Всегда раздражать, когда используются неправильные теги, а затем пользователь жалуется, что он не работает с используемой версией: P – PaReeOhNos

1

Для лучшего использования характеристик после

@user.trustees.where(default: true).where.not(id: trustees.pluck(:id)) 

используя срывать вместо карты существенно сократить время загрузки от 90 мс до 3 мс в аналогичном запросе я использую.

Смежные вопросы