Ruby on rails Rails 2.3.x-惰性数据库查询

Ruby on rails Rails 2.3.x-惰性数据库查询,ruby-on-rails,activerecord,named-scope,querying,Ruby On Rails,Activerecord,Named Scope,Querying,我想在ActiveRecord中基于GET参数并使用named\u scope构造一个查询。我想我会根据GET-param的可用性链接一些作用域并添加条件,但我担心这会使数据库工作过度,在添加的每个查询部分上发送一个新的查询: # in model named_scope :sorted, :order => 'title, author' named_scope :archived, :conditions => { :is_archived => true } named_

我想在ActiveRecord中基于GET参数并使用
named\u 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
发送到对象,但当命名的作用域接收参数时(如
by\u date
),这似乎有点脏,而且有点问题。我意识到我可以在
ActiveRecord::Base#find
中构造一个查询字符串来使用
:conditions=>…
,但我想我应该首先尝试使用named_scope,看看是否可以对后者进行延迟查询。关于如何使用命名的_作用域而不让数据库被查询轰炸,有什么建议吗?谢谢。

你可以让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