我正在尝试执行一项任务,要求我在我的Model类中创建并保存ActiveRecord,然后返回它。 rspec期望使用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),记录实际上存储在DB中。但是,返回的对象缺少find_by方法。所以,rspec失败了。我到处寻找,但似乎无法找到解决方案。我是一个菜鸟,很抱歉,如果答案很明显,我看不到它。
答案 0 :(得分:0)
你说
如果我执行User.new(params),记录实际上存储在DB中。但是,返回的对象
缺少find_by方法
这是预期的行为。希望您现在了解类和实例方法之间的区别。重要的一点是,诸如find_by
之类的查询方法不可用于模型实例。如果您执行user = User.find_by(id: params[:id])
之类的操作,则需要在find_by
模型上调用User
类方法。
where
中定义了order
,limit
,ActiveRecord::QueryMethods
等许多方法,这些方法可供ActiveRecord::Relation
使用对象和你的模型类。大多数这些方法都会返回ActiveRecord::Relation
个对象,这就是它们可以链接的原因,例如
User.where(params).order(created_at: :desc).limit(5)
但是find_by
是一个例外 - 它会返回一个模型实例,因此您无法继续查询结果。总之,User.new(params)
会返回一个没有find_by
可用的模型实例