Странное поведение в ActiveRecord finder при использовании условия SQL IN - PullRequest
2 голосов
/ 10 февраля 2010

У меня есть таблица с именем inbox_messages со следующими строками:

user_id message_id
======= ==========
4       8
4       1
4       7
0       9
0       10
0       11
0       12

Таблица соответствует следующей модели:

class InboxMessage < ActiveRecord::Base
end

Когда я вызываю метод find сIN caluse, я получаю разные результаты в зависимости от положения параметров.

InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "0,4"]) # 8 rows
InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "4,0"]) # 3 rows

Второй вызов выше, возвращает 3 строки вместо 8. Другие сценарии работают нормально, т.е.

InboxMessage.find(:all, :conditions => [ "user_id IN (0, 4)" ]) # 8 rows
InboxMessage.find(:all, :conditions => [ "user_id IN (4, 0)" ]) # 8 rows
InboxMessage.find(:all, :conditions => [ :user_id => [0, 4]  ]) # 8 rows
InboxMessage.find(:all, :conditions => [ :user_id => [4, 0]  ]) # 8 rows

Ответы [ 2 ]

4 голосов
/ 10 февраля 2010

Проблема в том, что литерал передается в оператор SQL как один литерал.

InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "0,4"])
becomes Select ... WHERE (user_id IN ('4,0'))

Попробуйте использовать две замены, и все будет работать так, как вы ожидаете

InboxMessage.find(:all, :conditions => [ "user_id IN (?, ?)", 0,4])
becomes Select ... WHERE (user_id IN (4,0))

Вы можете увидеть, что фактически является оператором SQL, посмотрев журнал в режиме разработки.

0 голосов
/ 10 февраля 2010

Это другая форма, которую я предпочитаю использовать, потому что считаю ее более читабельной:

InboxMessage.find_all_by_user_id([0,4])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...