Rails: объединить два запроса в один
Я новичок в рельсах. Вот следующий код с Foo в качестве объекта модели:
a = Foo
a = Foo.where(age: 18)
if params[:sort] == "desc"
a = a.order("name desc")
end
Здесь выполняются два запроса, я хочу объединить их в один или вы можете сказать, что я хочу выполнить Foo.where(age=18).order("name asc")
Помните, что может быть случай, когда порядок не нужен, т.е. params[:sort] не равен desc.
Пожалуйста, не давайте решение как
if params[:sort] == "desc"
a = a.where(age=18).order("name desc")
else
a = a.where(age=18)
end
поскольку это делает код избыточным, а также для большего количества параметров он может не работать.
3 ответа
Нет, ты ошибаешься. На самом деле, никаких запросов здесь не выполняется.
a = Foo
a = Foo.where(age=18)
if params[:sort] == "desc"
a = a.order("name desc")
end
Фактический запрос отправляется, когда вы начинаете получать данные. То есть сделать что-то вроде
a.each do |b|
# do something with b
end
До тех пор вы можете смело связывать критерии построения методов (where
, order
, select
и другие).
Если это то, что вы имеете в виду... Простое решение будет:
a.where(age: 18).order("name #{params[:sort] || 'asc'}")
Так что если params[:sort]
является nil
по умолчанию asc
,
На самом деле ваш код будет выполнять только один запрос. это связано с тем, что в rails вызовы базы данных выполняются только после получения доступа к результату. Поэтому, когда вы напишите a.first (или что-то подобное), он вызовет БД.