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 (или что-то подобное), он вызовет БД.

Другие вопросы по тегам