繁体   English   中英

在named_scope和rspec中使用类方法

[英]Using class methods in named_scope and rspec

我可能把自己画在了一个角落。

在我的一些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

所以我想我有两个问题:

  1. 这是对named_scope的滥用吗?如果是的话,哪种更好的书写方式呢?

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

谢谢

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

另外我不理解在=> UserStatus.Active.id中使用id。 你能把这个方法放在这里吗?

UserStatus.Active必须给您零,因此UserStatus.Active.id会给您此错误。 因为nil的id是4,所以请确保您在Active方法中获得记录。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM