Методы класса во внедренных документах Mongoid - PullRequest
3 голосов
/ 10 января 2012

Я хотел бы сохранить весь специфический для аутентификации код в файле, который определяет «модель» аутентификации следующим образом:

class User
  include Mongoid::Document
  embeds_one :auth
  field :username, type: String
end

class Auth
  include Mongoid::Document
  embedded_in :user, inverse_of: :auth
  field :password

  def self.login(user, pass)
    User.first(conditions: { username: user, password: pass })
  end
end

Проблема?Невозможно вызвать методы класса встроенных документов:

> Auth.login('user', 'pass')
Mongoid::Errors::InvalidCollection: Access to the collection for Auth is not allowed since it is an embedded document, please access a collection from the root document.

> User.auth.login('user', 'pass')
NoMethodError: undefined method `auth' for User:Class

Одиночные методы во встроенных Mongoid::Document моделях - не очень хорошая идея?

1 Ответ

1 голос
/ 17 июля 2012

Вы не можете получить доступ к встроенным документам напрямую, как пытались в первый раз Auth.loggin('user','pass').У вас должны быть только экземпляры методов во встроенных моделях документов, таких как

def self.login(user, pass)
   User.first(conditions: { username: user, password: pass })
end

, и вы можете получить к ним доступ с помощью объекта пользователя, такого как

@user.auth.login('user','pass')
...