如何创建一个“named_scope”类的方法,什么都不做?

时间:2013-10-05 13:28:16

标签: ruby-on-rails ruby-on-rails-4

使用命名范围,可以创建一个带参数的范围,但如果参数为.blank?则不会执行任何操作。如何使用类方法获得相同的结果?

鉴于这样的模型

class Product
  belongs_to :category

  def self.in_category(id)
    where('"category".id = ?', id) unless id.blank?
  end
end

Product.all.in_category("")返回nil,但我希望它与Product.all做同样的事情。

我唯一的想法是将.in_category设置为if..else..endelse执行一些不必要的工作where('"category".id = *'),但我不想将生成的SQL混为一谈不必要的陈述。

1 个答案:

答案 0 :(得分:2)

您可以为参数提供默认值:

def self.in_category(id = nil) # Allows id to be blank by default
  if id.blank?
    all
  else
    where('"category".id = ?', id) 
  end
end

另外,您可以考虑将实际的类别对象传递给此方法,直接使用id是很明智的:

def self.in_category(_category = nil) # Allows id to be blank by default
  if _category.blank?
    all
  else
    where(category: _category) 
  end
end