Подтвердить что ты не робот

Построение 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 для фильтрации, это действие контроллера будет очень сложным.

4b9b3361

Ответ 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 - Вложенные ресурсы).