Rails ActiveRecord запрос - PullRequest
       0

Rails ActiveRecord запрос

0 голосов
/ 11 сентября 2011

У меня двоякий вопрос ... Прежде всего, я пытаюсь выяснить, как задать > или < при фильтрации этого запроса.В конце вы можете видеть, что у меня есть .where(:created_at > 2.months.ago), и это неправильный синтаксис, но я не уверен, что правильный способ вызвать что-то похожее.

Во-вторых, это немного длинная строка и собираетсячтобы получить больше, так как есть больше условий, которые я должен учитывать. Есть ли более чистый способ построения этого, или длинная строка условий, подобных этому довольно стандартному?

class PhotosController < ApplicationController
  def showcase
    @photos = Photo.order(params[:sort] || 'random()').search(params[:search]).paginate(:per_page => 12, :page => params[:page]).where(:created_at > 2.months.ago)
  end

Спасибо.

Ответы [ 2 ]

4 голосов
/ 11 сентября 2011

К сожалению, вы попали в больную точку в API запросов ActiveRecord. Там нет стандартного, из коробки способ сделать это. Вы можете делать диапазоны дат очень легко, но у < и > нет простого пути. Однако Arel, основной движок SQL, может сделать это очень легко. Вы можете написать простую область видимости, чтобы справиться с этим следующим образом:

scope :created_after, lambda {|date| where arel_table[:created_at].gt(date) }

И вы можете легко сделать рефакторинг, чтобы взять столбец, или gt против lt и т. Д.

Однако другие люди уже решили эту проблему, и вы могли бы воспользоваться их работой. Одним из примеров является MetaWhere , который добавляет кучу синтаксического сахара к вашим запросам. Например, используя его, вы можете написать:

Article.where(:title.matches => 'Hello%', :created_at.gt => 3.days.ago)

На # 2 области видимости имеют тенденцию становиться длинными. Вы можете взглянуть на гем has_scope , который помогает облегчить это путем определения областей действия на контроллере аналогично тому, как они определяются в модели. Пример с сайта:

# The model
# Note it's using old Rails 2 named_scope, but Rails 3 scope works just as well.
class Graduation < ActiveRecord::Base
  named_scope :featured, :conditions => { :featured => true }
  named_scope :by_degree, proc {|degree| { :conditions => { :degree => degree } } }
end

# The controller
class GraduationsController < ApplicationController
  has_scope :featured, :type => :boolean
  has_scope :by_degree

  def index
    @graduations = apply_scopes(Graduation).all
  end
end
2 голосов
/ 11 сентября 2011
  • Вы можете сделать where(["created_at > ?", 2.months.ago]) для вашего первого вопроса.
  • Для вашего второго вопроса есть несколько решений:
    • Вы можете использовать области видимости, чтобы встроить в них условия, а затем объединить их.
    • Вы можете разбить строку на несколько строк.
    • Вы можете оставить это так, если у вас большой экран и вы не работаете с другими людьми.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...