Rails - условный запрос с ActiveRecord? - PullRequest
0 голосов
/ 08 января 2011

С учетом запроса типа:

current_user.conversations.where("params[:projectid] = ?", projectid).limit(10).find(:all)

params [: projectid] отправляется из jQuery ajax.Иногда это целое число и выше работает нормально.Но если при использовании выбирается «Все проекты», это значение «», в котором рельсы превращаются в 0. Это приводит к неверному запросу

Как с рельсами вы говорите параметры поиска [: projectid] =? Если определено?

Спасибо

Ответы [ 2 ]

5 голосов
/ 08 января 2011

Я думаю, что вы, возможно, немного опечатали запрос. "params[:projectid] = ?" не должно быть допустимым условием запроса ни при каких обстоятельствах.

В любом случае вы можете сделать какое-то условное утверждение:

if params[:project_id].blank?
  @conversations = current_user.conversations.limit(10)
else
  @conversations = current_user.conversations.where("project_id = ?", params[:project_id]).limit(10)
end

Хотя, я бы, наверное, предпочел что-то вроде этого:

@conversations = current_user.conversations.limit(10)
@converstaions.where("project_id = ?", params[:project_id]) unless params[:project_id].blank?

Sidenotes:

  1. Вам не нужно использовать .find(:all). Rails автоматически выполнит запрос, когда потребуется набор результатов (например, когда вы выполните @conversations.each).
  2. Везде, где это возможно, старайтесь придерживаться схемы именования в Rails со змеиной оболочкой (например, project_id вместо projectid). В долгосрочной перспективе вы избавите себя и своих коллег от многих головных болей.

Спасибо, но если запрос where имеет, скажем, 3 параметра, например, project_id, project_status, ..., тогда разве что идея не сработает. Я шокирован, что у Rails нет лучшего способа обработки параметров условных запросов

РЕДАКТИРОВАТЬ: Если у вас есть несколько параметров, которые могут быть частью запроса, учтите тот факт, что where принимает хеш в качестве аргумента. При этом вы можете легко построить хеш параметра динамически и передать его where. Примерно так, может быть:

conditions = [:project_id, :project_status, :something_else].inject({}) do |hsh, field|
  hsh[field] = params[field] unless params[field].blank?
  hsh
end

@conversations = current_user.conversations.where(conditions).limit(10)

В приведенном выше случае вы перебираете все поля в массиве и добавляете каждое из них в результирующий хэш , если не пусто. Затем вы передаете хеш в функцию where, и все в порядке.

0 голосов
/ 08 января 2011

Я не понимаю, почему вы ставите:

where("params[:projectid] = ?", projectid)

, если вы получаете params [: project] из запроса ajax, строка запроса не должна быть:

where("projectid = ?", params[:projectid])

intead?

И если вы получаете пустую строку ('') в качестве параметра, который вы всегда можете проверить:

unless params[:projectid].blank?

Не думаю, что я понял ваш вопрос, ноя надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...