Подтвердить что ты не робот

Как я могу получить все имена полей Мондоидского документа?

Я создаю бэкэнд-систему, как написано в учебнике Iain Hecker: http://iain.nl/backends-in-rails-3-1, и я пытаюсь адаптировать его к MongoDB с Mongoid.

Итак, когда мне нужно писать в backend/resourse_helper.rb

module Backend::ResourceHelper

  def attributes
    resource_class.attribute_names - %w(id created_at updated_at)
  end

end

Я получаю следующую ошибку:

undefined method `attribute_names' for Backend::User:Class

(Я привязал backend к "backend/users # index" ). Backend:: Пользователь наследует пользователя:

class User
  include Mongoid::Document

  devise_for :users

  field :name
  field :address
end

Мне просто нужен список полей для этого User: Class, как я думаю (например, [ "email", "name", "address",...]), но я сломал себе голову, пытаясь найти, как это сделать.

4b9b3361

Ответ 1

Mongoid уже предоставляет вам атрибуты для объекта:

Model.new.attributes

Чтобы получить имена для этих атрибутов:

Model.fields.keys

Ответ 2

Использовать встроенный метод:

Model.attribute_names
# => ["_id", "created_at", "updated_at", "name", "address"]

Ответ 3

Следует отметить, что Model.fields.keys будет перечислять только полевые ключи, определенные в классе Model. Если вы используете динамические поля, они не будут показаны. Model.attributes.keys также будут включать ключи атрибутов для любых динамических полей, которые вы использовали.

Ответ 4

Вы на правильном пути с attribute_names. Я думаю, вам просто нужно убедиться, что вы включили свой модуль в нужное место. Например, если у вас есть тот же модуль:

module Backend::ResourceHelper
  def attributes
    resource_class.attribute_names - %w(id created_at updated_at)
  end
end

Ваш класс должен выглядеть так:

class User
  include Mongoid::Document
  extend Backend::ResourceHelper

  devise_for :users

  field :name
  field :address
end

Тогда вызов User.attributes должен вернуть ["name", "address"]