2016-09-19 3 views
0

Я пытаюсь выполнить назначение, которое требует от меня создать и сохранить ActiveRecord в моем классе Model, а затем вернуть его. 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]), вы вызываете метод класса 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

Смежные вопросы