缺少对象的ActiveRecord方法(find_by)

时间:2016-09-19 19:19:52

标签: ruby ruby-on-rails-4

我正在尝试执行一项任务,要求我在我的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失败了。我到处寻找,但似乎无法找到解决方案。我是一个菜鸟,很抱歉,如果答案很明显,我看不到它。

1 个答案:

答案 0 :(得分:0)

你说

  

如果我执行User.new(params),记录实际上存储在DB中。但是,返回的对象

缺少find_by方法

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

where中定义了orderlimitActiveRecord::QueryMethods等许多方法,这些方法可供ActiveRecord::Relation使用对象和你的模型类。大多数这些方法都会返回ActiveRecord::Relation个对象,这就是它们可以链接的原因,例如

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

但是find_by是一个例外 - 它会返回一个模型实例,因此您无法继续查询结果。总之,User.new(params)会返回一个没有find_by可用的模型实例