Построение Rails ActiveRecord, где предложение
Какой лучший способ создать предложение where с помощью Rails ActiveRecord? Например, скажем, у меня есть действие контроллера, которое возвращает список сообщений в блоге:
def index
@posts = Post.all
end
Теперь скажем, что я хочу иметь возможность передать параметр url, чтобы это действие контроллера только возвращало сообщения определенным автором:
def index
author_id = params[:author_id]
if author_id.nil?
@posts = Post.all
else
@posts = Post.where("author = ?", author_id)
end
end
Это не кажется мне очень сухим. Если бы я должен был добавить упорядочение или разбиение на страницы или, что еще хуже, более необязательные параметры строки запроса URL для фильтрации, это действие контроллера будет очень сложным.
Ответы
Ответ 1
Как насчет:
def index
author_id = params[:author_id]
@posts = Post.scoped
@post = @post.where(:author_id => author_id) if author_id.present?
@post = @post.where(:some_other_condition => some_other_value) if some_other_value.present?
end
Post.scoped
по существу является ленивым загруженным эквивалентом Post.all(поскольку Post.all возвращает массив
немедленно, а Post.scoped просто возвращает объект отношения). Этот запрос не будет выполнен до тех пор, пока
вы на самом деле пытаетесь перебрать его в виде (путем вызова .each).
Ответ 2
Mmmh, лучший подход, который вы хотите использовать, может состоять в том, чтобы распространить это на 2 действия.
def index
@post = Post.all
end
def get
@post = Post.where("author=?", params[:author_id])
end
ИМХО имеет смысл, если вы думаете о RESTful API, индекс означает перечислить все и получить (или показать), чтобы получить запрошенный и показать его!
Ответ 3
Что-то вроде этой работы?
def get
raise "Bad parameters...why are you doing this?" unless params[:filter].is_a?(Hash)
@post = Post.where(params[:filter])
end
Затем вы можете сделать что-то вроде:
? filter [author_id] = 1 & фильтр [post_date] =... и т.д.
Ответ 4
Вы должны моделировать URL-адрес, используя вложенные ресурсы. Ожидаемый url будет /authors/ 1/posts. Подумайте об авторах как о ресурсах. Читайте о вложенных ресурсах в этом руководстве: http://guides.rubyonrails.org/routing.html (прокрутите до 2.7 - Вложенные ресурсы).