Rails 2.3.x - ленивый db-запрос - PullRequest
       26

Rails 2.3.x - ленивый db-запрос

0 голосов
/ 26 апреля 2011

Я хотел бы построить запрос в ActiveRecord на основе параметров GET и с использованием named_scope.Я думал, что объединю некоторые области видимости и добавляю условия, основанные на доступности параметров GET, но я боюсь, что это приведет к перегрузке БД, посылая новый запрос на каждую добавленную часть запроса:

# 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 Ответ

1 голос
/ 26 апреля 2011

Вы можете сделать лямбду умнее

# 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
...