Я думаю, что вы, возможно, немного опечатали запрос. "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:
- Вам не нужно использовать
.find(:all)
. Rails автоматически выполнит запрос, когда потребуется набор результатов (например, когда вы выполните @conversations.each
).
- Везде, где это возможно, старайтесь придерживаться схемы именования в 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, и все в порядке.