2016-09-19 32 views
0

我正在尝试做一个任务,它需要我在我的Model类中创建并保存一个ActiveRecord,然后将其返回。 rspec期望使用find_by方法来验证这一点。这里是我的模型:缺少对象的ActiveRecord方法(find_by)

-----------------------

class User < ActiveRecord::Base 
attr_accessor :id, :username, :password_digest, :created_at, :updated_at 
after_initialize :add_user 

def initialize(attributes={}) 
    @username = attributes[:username] 
    @password_digest = attributes[:password_digest] 
    super 
end 

def add_user 
    self[:username] = @username 
    self[:password_digest] = @password_digest 
    self.save 
    self[:id] = self.id 
end 
end 

------------ ----

如果我做User.new(params),记录实际上是正确存储到数据库。但是,返回的对象缺少find_by方法。所以,rspec失败。我到处寻找,但似乎无法找到解决方案。我是一个小菜鸟,所以很抱歉,如果答案很明显,我看不到它。

+0

请显示失败的RSpec示例和错误消息。 – Stefan

+1

ActiveRecord对象没有'find_by'方法...'find_by'是一个类方法。 你可以显示RSpec测试吗? – SteveTurczyn

+0

这有些很奇怪的代码 - 例如有User.new保存记录是非常不寻常的。 –

回答

0

你说

如果我做User.new(PARAMS),记录实际上是在正确地存储到数据库。但是,返回对象缺少find_by方法

这是预期的行为。希望您现在了解类和实例方法之间的区别。主要重点在于诸如find_by等查询方法不适用于模型实例。如果您执行的操作类似user = User.find_by(id: params[:id]),则您在User模型上调用find_by类方法。

有许多像whereorderlimit等方法ActiveRecord::QueryMethods中定义的 - 这是提供给ActiveRecord::Relation对象和模型类。大多数这些方法将返回ActiveRecord::Relation对象,这就是为什么它们是可链接的,例如,

User.where(params).order(created_at: :desc).limit(5) 

然而find_by是个例外 - 所以你不能继续对结果查询将返回模型实例。在总结User.new(params)返回没有的模型的一个实例find_by可用