0

嗨有这样的模型:

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 内设置条件?

谢谢

4

2 回答 2

1

是的,只需这样做:

unless name.blank?

在 lambda 内部。通过这种方式,您还可以设置默认查询以在未给出参数时执行

于 2010-05-23T14:32:41.120 回答
0

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

调用者应该根据可用的参数调用适当的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 }%"] }
}
于 2010-05-23T14:46:43.817 回答