0

我想基于 GET 参数在 ActiveRecord 中构造一个查询,并使用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'

我想到的另一个选择是构建一个方法链接字符串,然后使用 将其发送到对象,但是当 named_scope 接收参数(如)Object#send时,这似乎有点脏并且有些问题。by_date我意识到我可以构造一个与:conditions => ...in一起使用的查询字符串ActiveRecord::Base#find,但我想我会先尝试使用 named_scope 来查看是否可以使用后者进行惰性查询。关于如何使用 named_scope 并且不让数​​据库被查询轰炸的任何建议?谢谢。

4

1 回答 1

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
于 2011-04-26T14:59:19.870 回答