使用命名范围,可以创建一个带参数的范围,但如果参数为.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..end
,else
执行一些不必要的工作where('"category".id = *')
,但我不想将生成的SQL混为一谈不必要的陈述。
答案 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