Rails - Searchlogic для условия поиска как массив значений - PullRequest
1 голос
/ 15 сентября 2010

У меня есть две модели Сотрудник & Единица . Единица имеет много сотрудников . Я использую SearchLogic для поиска модели сотрудника. Что эквивалентно приведенному ниже SQL в Searchlogic

employees.unit_id IN (1,2,3)

Я пробовал оба

unit_id_equals_all[] 
unit_id_equals_any[]

Но ничего не работает. Кто-нибудь может помочь?

Спасибо, Абхилаш

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Та же проблема здесь.

Я понятия не имею, почему это сработало для меня, или почему я даже попробовал это, так как это недокументировано. Но я изменил _equals на _in, и он генерировал SQL с IN, и работал отлично.

Employee.unit_id_in([1, 2, 3])
1 голос
/ 19 августа 2011

У нас была такая же проблема с проектом Rails 2.3.12.С searchlogic 2.4.7 мы могли бы сделать:

User.id_equals([1,2,3])

После обновления до логики поиска 2.5.8 (сообщения об устаревании в старом загромождали вывод огурца и спецификации), этот синтаксис больше не работал.Он выдал эту ошибку, как показано выше:

ActiveRecord::StatementInvalid: Mysql::Error: Operand should contain 1 column(s): SELECT * FROM `users` WHERE (users.id = 1, 2, 3) 

После попытки решения выше, мы обнаружили, что эти две синтаксические альтернативы работают:

User.id_in([1,2,3]) <-- as suggested above
User.id_equals_any([1,2,3])

Другими словами, без "_any "новая логика поиска выдает недопустимый mysql.Изучая, когда и почему это изменение могло произойти, я обнаружил следующее обсуждение:

Github, изменяющий обработку обработки массивов

Результат этого изменения и обсуждения былтребовать _any для случаев, когда требуется сопоставить любое значение в массиве, а в противном случае просто передать массив в оператор equals напрямую, не изменяя SQL на «IN», как это необходимо для нескольких значений.

Возвращение к 2.4.7 устраняет ошибку.Мы изменили все вызовы на более явные _any или _in, чтобы избежать ошибок устаревания.Надеюсь, что это помогает и добавляет очень полезные ответы выше.

1 голос
/ 15 сентября 2010
Employee.unit_id_equals([1, 2, 3])
...