Я использую рельсы 2.3.5 (на данный момент не могу обновить). Я пытаюсь сделать find на основе наличия нескольких параметров. Вот мой код:
qstr = "customer_name_id = ?"
qparams = [customer_engagement.customer_id]
unless customer_engagement.games_opened_since.nil?
qstr << " and created_at >= ?"
qparams << customer_engagement.games_opened_since
end
Issue.find(:all, :conditions => [qstr, qparams]).each_with_index do |issue,index|
Когда я запускаю этот код, я получаю эту ошибку:
wrong number of bind variables (1 for 2) in: customer_name_id = ? and created_at >= ?
Может кто-то помочь мне с этим?
Ответ 1 · Joe Kennedy
Я считаю, что массив, который вы передаете :conditions, если customer_engagement.games_opened_since не равен нулю:
["customer_name_id = ? and created_at >= ?", [customer_engagement.customer_id, customer_engagement.games_opened_since]]
Вы не хотите, чтобы qparams был массивом внутри массива, который вы передаете :conditions. Вы хотите, чтобы ваш массив выглядел так:
["customer_name_id = ? and created_at >= ?", customer_engagement.customer_id, customer_engagement.games_opened_since]
Изменение вашего кода на это должно помочь:
qconditions = ["customer_name_id = ?", customer_engagement.customer_id]
unless customer_engagement.games_opened_since.nil?
qconditions[0] << " and created_at >= ?"
qconditions << customer_engagement.games_opened_since
end
Issue.find(:all, :conditions => qconditions).each_with_index do |issue,index|
Ответ 2 · Stefan
IIRC, вы можете использовать анонимную область:
issues = Issue.scoped({})
issues = issues.condition "customer_name_id = ?", customer_engagement.customer_id
issues = issues.condition "created_at >= ?", customer_engagement.games_opened_since if customer_engagement.games_opened_since
issues.each_with_index do |issue, index|
# ...
end