#ruby-on-rails #activerecord #named-scope #querying
#ruby-on-rails #activerecord #именованная область #запрос
Вопрос:
Я хотел бы создать запрос в ActiveRecord на основе параметров GET и с использованием named_scope
. Я думал, что объединю некоторые области и добавлю условия, основанные на доступности GET param, но я боюсь, что это перегрузит БД, отправляя новый запрос для каждой добавленной части запроса:
# in model
named_scope :sorted, :order => 'title, author'
named_scope :archived, :conditions => { :is_archived => true }
named_scope :by_date, lambda { |date| { :conditions => [ 'updated_at = ?', date ] } }
# in controller / helper
@articles = Article.sorted.all
@articles = @articles.by_date(params[:date]) if params[:date]
@articles = @articles.archived if params[:archived] == '1'
Другой вариант, о котором я подумал, — это создание метода, объединяющего строку, которая затем будет отправлена объекту с помощью Object#send
, но это кажется немного грязным и несколько проблематичным, когда named_scope получает аргументы (например by_date
). Я понимаю, что могу создать строку запроса для использования с :conditions => ...
в ActiveRecord::Base#find
, но я подумал, что сначала попробую с named_scope, чтобы посмотреть, возможно ли выполнить отложенный запрос с последним. Есть предложения о том, как это сделать, используя named_scope и не подвергая базу данных бомбардировке запросами? Спасибо.
Ответ №1:
Вы можете сделать lambda более умным
# in model
named_scope :sorted, :order => 'title, author'
named_scope :archived, lambda { |is_archived| (is_archived == 1) ? {:conditions => {:is_archived => true}} : {}}
named_scope :by_date, lambda { |date| date.nil? ? {} : { :conditions => [ 'updated_at = ?', date ]}}
# in controller / helper
@articles = Article.by_date(params[:date]).archived(params[:archived]).sorted