在 named_scope 和 rspec 中使用 class 方法

Using class methods in named_scope and rspec

我可能把自己画到墙角了。

在我的一些 rails (2.3.18) named_scopes 中,我使用 class 方法从数据库中检索已知行 - 例如状态值。

但是,当我尝试将它们与 rspec 一起使用时,我认为我遇到了问题,因为在应用程序加载之前,固定装置(我正在使用 FactoryGirl)尚未加载 - 所以我在解析 named_scopes(我认为)时出现错误。

例如:

named_scope :active_users, :conditions => [ 'status_id = ?', UserStatus.Active.id ]

加载用户模型时会产生错误

app/models/user.rb:34: Called id for nil, which would mistakenly be 4

这是 named_scope 行。

user_status.rb
  def self.Active
    UserStatus.find_by_name('active')
  end

所以我想我有两个问题:

  1. 这是对 named_scope 的滥用吗?如果是的话,更好的写法是什么?

  2. 是否可以rspec在加载应用程序之前将一些关键数据加载到数据库中?

谢谢

您的命名范围写得很好。您需要检查 UserStatus.Active.id 的输出。它应该是 return 个 ID 数组。根据命名约定,如果您在 UserStatus 中编写了名为 'Active' 的方法,那么它是错误的。它应该是小写的。

我也不明白id在=> UserStatus.Active.id中的用法。你能把这个方法放在这里吗?

UserStatus.Active 一定是给你 nil 所以 UserStatus.Active.id 给你这个错误。因为 nil 的 id 是 4。确保你在 Active 方法中获取记录

设法回答了我自己的问题并将其放在这里以防其他人遇到同样的问题。

为了确保在解析 named_scope 时避免尝试访问数据库,我需要将 :condition 包装在 lamdba / proc 中,如下所示

named_scope :active_users, lambda {{ :conditions => [ 'status_id = ?', UserStatus.Active.id ] }}

这现在允许加载应用程序,然后像往常一样在测试之前将测试所需的数据加载到数据库中。