仅当存在params时才执行named_scoped

时间:2010-05-23 14:20:46

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

你有这样的模特:

class EventDate < ActiveRecord::Base
belongs_to :event

named_scope :named, lambda { | name | { 
    :joins => { :event => :core}, 
    :conditions => ["name like ?", "%#{ name }%"] 
  }}

  named_scope :date_range, lambda { | start, length | { 
    :conditions => ["day >= ? AND day <= ?", start, date + (length || 30) ]
  }}

如果我启动它可以正常工作 name =“ba” start = Date.today EventDate.named(name).date_range(start,start + 2)

但是如果名称或开头是nil我不想执行named_scope之类的 name = nil EventDate.named(name).date_range(start,start + 2)

是否可以在named_scope内设置条件?

感谢

2 个答案:

答案 0 :(得分:1)

是, 只是做:

unless name.blank?

在lambda里面。 通过这种方式,您还可以将默认查询设置为 如果没有给出参数,则执行

答案 1 :(得分:0)

Named_scope并不打算处理这种逻辑。它旨在帮助您设置可能经常出现的某些条件。

调用者应根据可用的params调用适当的named_scope,即在调用named_scope之前添加一个条件。例如:

if name.blank?
  EventDate.date_range(start, end)
else
  EventDate.named(name).date_range(start, end)
end

话虽如此,从技术上讲,你可以在范围内做类似的事情。为named_scope创建的Lambda需要返回一个哈希,你可以把它放入其中(但请不要这样做!)并且如果name为空则返回空哈希。例如:

named_scope :named, lambda { | name |
  name.blank? ? {} : { :conditions => ["name like ?", "%#{ name }%"] }
}