Rails 2.3.x - 懒数据库查询

时间:2011-04-26 05:08:14

标签: ruby-on-rails activerecord named-scope querying

我想基于GET参数并使用named_scope在ActiveRecord中构造一个查询。我以为我会链接一些范围并根据GET参数可用性添加条件,但我担心这会过度使用db,在每个查询部分上添加一个新查询:

# 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接收参数时,这似乎有点脏,有些问题(如{{ 1}})。我意识到我可以在by_date中构造一个与:conditions => ...一起使用的查询字符串,但我想我会首先尝试使用named_scope来查看是否可以使用后者进行懒惰查询。有关如何使用named_scope执行此操作并且没有数据库被查询轰炸的任何建议?感谢。

1 个答案:

答案 0 :(得分: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