Rails 2.3.x — отложенный запрос к БД

#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