К сожалению, вы попали в больную точку в 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