0

GETパラメータに基づいて。を使用してActiveRecordでクエリを作成したいと思います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'

私が考えたもう1つのオプションは、を使用してオブジェクトに送信されるメソッドチェーン文字列を作成するObject#sendことですが、named_scopeが引数(などby_date)を受け取ると、少し汚く、やや問題があるように見えます。:conditions => ...で使用するクエリ文字列を作成できることはわかっていますがActiveRecord::Base#find、最初にnamed_scopeを試して、後者で遅延クエリを実行できるかどうかを確認したいと思いました。named_scopeを使用してこれを行う方法について、データベースにクエリがぶつからないようにするための提案はありますか?ありがとう。

4

1 に答える 1

1

ラムダをよりスマートにすることができます

# 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
于 2011-04-26T14:59:19.870 に答える