2010-09-15 2 views
1

У меня есть две модели Employee & Unit. Узел имеет большое количество сотрудников. Я использую SearchLogic для поиска модели сотрудника. Что является эквивалентом ниже SQL в SearchlogicRails - Searchlogic искать условие как массив значения

employees.unit_id IN (1,2,3) 

Я попытался как

unit_id_equals_all[] 
unit_id_equals_any[] 

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

Спасибо, Abhilash

ответ

1
Employee.unit_id_equals([1, 2, 3]) 
+0

К сожалению, это не сработает. Я получаю эту ошибку «неправильное число переменных привязки (2 для 1) in: employees.unit_id IN (?)» – eabhvee

+0

Не могли бы вы дать больше намеков на сообщение об ошибке? например, когда генерируется сообщение? Я не могу понять, почему было 2 переменные ...... – PeterWong

+0

В моем режиме просмотра я выбрал 2 единицы и передал их как массив, если я выберу 5, он скажет 5 для 1. Мой параметр hash таков: -> unit_id_equals "=> [" 332 "," 333 "] – eabhvee

1

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

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

Employee.unit_id_in([1, 2, 3]) 
1

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

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

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

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 commit changing handling of arrays

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

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

+0

Хороший улов, похоже, что документы требуют обновления. – Zubin

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