2016-09-19 64 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可用