我可能把自己画成了一个角落。
在我的一些rails(2.3.18)named_scopes中,我使用类方法从数据库中检索已知行 - 例如状态值。
然而,当我尝试将这些与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
所以我想我有两个问题:
这是对named_scope的滥用吗?如果有的话,这会是一种更好的写作方式吗?
是否有可能让rspec在加载应用程序之前将一些关键数据加载到数据库中?
由于
答案 0 :(得分:0)
你的指定范围写得很好。您需要检查UserStatus.Active.id的输出。它应该返回id数组。根据命名约定,如果您在UserStatus中编写了名为“Active”的方法,则它是错误的。它应该是小写的。
另外我不明白在=>中使用id UserStatus.Active.id。你能把这个方法放在这里吗?
答案 1 :(得分:0)
UserStatus.Active必须给你零 UserStatus.Active.id给出了这个错误。因为nil的id是4.确保你在Active方法中获得记录
答案 2 :(得分:0)
管理回答我自己的问题并将其放在这里以防其他人有同样的问题。
为了确保在解析named_scope时尝试访问数据库,我需要将:condition包装在lamdba / proc中,如下所示
named_scope :active_users, lambda {{ :conditions => [ 'status_id = ?', UserStatus.Active.id ] }}
现在允许加载应用程序,然后像往常一样在测试之前将测试所需的数据加载到数据库中。