Rails 2.3.5 Условия построения задачи Массив динамически при использовании в (?) - PullRequest
3 голосов
/ 17 августа 2011

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)

Я собираюсьотступить и поработать над преобразованием всего этого в именованные области, но мне бы очень хотелось понять, как заставить это работать таким образом.

1 Ответ

3 голосов
/ 18 августа 2011

Рельсы 4

users  = User.all
users  = User.where(id: params[id]) if params[id].present?
users  = User.where(state: states) if states.present?
users.each do |u|
  puts u.name
end

Старый ответ

Обезьяна исправит класс Array. Создайте файл с именем monkey_patch.rb в каталоге config/initializers.

class Array
  def where(*args)
    sql = args.first    
    unless (sql.is_a?(String) and sql.present?)
      return self
    end    
    self[0] = self.first.present? ? " #{self.first} AND #{sql}  " : sql 
    self.concat(args[1..-1])    
  end
end

Теперь вы можете сделать это:

cond = []
cond.where("id = ?", params[id]) if params[id].present?
cond.where("state IN (?)", states) unless states.empty?
User.all(:conditions => cond)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...