为什么 find_by 范围在结果为 nil 时返回一个数组

Zak*_*ria 2 activerecord ruby-on-rails

我的模型中有一个范围:

scope :default_template, ->(template_type) { find_by(is_default: true, template_type: template_type) }
Run Code Online (Sandbox Code Playgroud)

我正在使用find_by但问题是:当没有记录时,范围的结果是一个空白数组而不是nil.

EmailTemplate.default_template('blahblah')  # => []
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么吗?

Seb*_*lma 5

这在文档中说明

... 如果它返回 nil 或 false,则返回一个 all 范围。

为了使您的范围是可组合的,它应该返回一个 ActiveRecord::Relationship,如果没有记录满足给定的条件,则返回一个空的 ActiveRecord::Relationship。这确保了模型中的进一步范围调用在对nil结果调用它们时不会引发 NoMethodError 。

如果你真的需要它返回 nil,那么让你的作用域成为一个类方法。这将保留原始返回值。