0

使用命名范围,可以创建一个带参数的范围,但如果参数是.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的事情,但我不想用不必要的语句使生成的 SQL 混乱。elsewhere('"category".id = *')

4

1 回答 1

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
于 2013-10-05T13:32:25.607 回答