Rails 2.3.5
Я рассмотрел ряд других вопросов, касающихся динамического создания условий для поиска ActiveRecord.
Я знаю, что есть несколько замечательных жемчужин.как логика поиска и что это лучше в Rails3.Тем не менее, я использую геокит для геопространственного поиска и пытаюсь создать только стандартный набор условий, который позволит мне комбинировать множество различных фильтров.
У меня есть 12 различных фильтров, которые я пытаюсьдинамически комбинировать для расширенного поиска.Мне нужно иметь возможность смешивать равенство, больше, меньше, чем в (?) И условиях IS NULL.
Вот пример того, что я пытаюсь заставить работать:
conditions = []
conditions << ["sites.site_type in (?)", params[:site_categories]] if params[:site_categories]
conditions << [<< ["sites.operational_status = ?", 'operational'] if params[:oponly] == 1
condition_set = [conditions.map{|c| c[0] }.join(" AND "), *conditions.map{|c| c[1..-1] }.flatten]
@sites = Site.find :all,
:origin => [lat,lng],
:units => distance_unit,
:limit => limit,
:within => range,
:include => [:chargers, :site_reports, :networks],
:conditions => condition_set,
:order => 'distance asc'
Мне кажется, что я могу нормально работать, когда в выражении условия есть только отдельные переменные, но когда у меня есть что-то (?) И массив значений, я получаю ошибку из-за неправильного числаобязательные условия.То, как я соединяю и выравниваю условия (основываясь на ответе Объединение массивов условий в Rails ), похоже, неправильно обрабатывает массив, и я недостаточно понимаю логику выравнивания, чтобы отследитьпроблема.
Итак, скажем, у меня есть 3 значения в параметрах [: site_categories] Я приведенный выше код оставляет меня со следующим:
Условия это
[["sites.operational_status = ?", "operational"], ["sites.site_type in (?)", ["shopping", "food", "lodging"]]]
Сглаженная попытка:
["sites.operational_status = ? AND sites.site_type in (?)", ["operational"], [["shopping", "food", "lodging"]]]
Что дает мне:
неверное количество переменных связывания (4 на 2)
Я собираюсьотступить и поработать над преобразованием всего этого в именованные области, но мне бы очень хотелось понять, как заставить это работать таким образом.