Как я могу получить все имена полей Mongoid Документа? - PullRequest
17 голосов
/ 10 августа 2011

Я создаю бэкэнд-систему, как написано в учебном пособии Иэйна Хеккера: 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 / users # index»).Backend :: User наследует от User:

class User
  include Mongoid::Document

  devise_for :users

  field :name
  field :address
end

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

Ответы [ 4 ]

35 голосов
/ 10 августа 2011

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

Model.new.attributes

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

Model.fields.keys
13 голосов
/ 17 июля 2014

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

Model.attribute_names
# => ["_id", "created_at", "updated_at", "name", "address"]
3 голосов
/ 04 апреля 2013

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

1 голос
/ 10 августа 2011

Вы на правильном пути с 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"]

...