2011-08-10 89 views
17

我正在构建后端系统,如Iain Hecker的教程中所写:http://iain.nl/backends-in-rails-3-1,我尝试使用Mongoid将其调整到MongoDB。如何获得Mongoid文档的所有字段名称?

所以,当我需要在后端/ 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 

(我扎根后端 “后端/用户#指数”)。 后端::用户从用户继承:

class User 
    include Mongoid::Document 

    devise_for :users 

    field :name 
    field :address 
end 

我只需要为用户字段的列表:类,因为我想(即[“电子邮件”,“姓名”,“地址”,... ]),但我打破了我的头试图找到如何。

回答

30

Mongoid已经为您提供了一个对象的属性:

Model.new.attributes 

获取名称f或这些属性:

Model.fields.keys 
+0

根据所给示例的上下文以及报告的错误消息,我会假设Yuri在这里与一个类一起工作,而不是一个实例。如果这是真的,那么要求他实例化课程似乎没有必要。 – bloudermilk

+0

@Bloudermilk:对,你是。我已经更新了这个答案,现在使用'Model.fields.keys',因为这将返回正确的字段。 –

+0

谢谢,瑞恩!你的解决方案为我工作。我删除了Backend :: User并写了'a = []; resource_class.all.collect {| r | r.fields.keys.each {| k | a << k}}; a.uniq - %w(_id _type created_at updated_at encrypted_pa​​ssword)'。你不知道我该如何重构这个字符串?我对Ruby有点新) –

1

您正在与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"]

+0

不,那是不行的,它返回用户一样'未定义的方法'属性:Class'。 –

+0

如果你*包括*'Backend :: ResourceHelper'那么'attributes'方法不会来自那个。将模块包含到类中将使该模块的方法在类的实例上可用,而不是类本身。 –

+0

谢谢,瑞安。我应该写'延长'(更新)。另外,我的回答假设Yuri正在和班级一起工作。要求实例化该类将是一个不合理的解决方案,IMO。 – bloudermilk

3

有一点需要注意的是,Model.fields.keys只会列出Model类中定义的字段键。如果您使用动态字段,则不会显示。 Model.attributes.keys还将包含您使用的任何动态字段的属性键。

+0

'Model.attributes.keys'不起作用并抛出'未定义的方法属性'错误。 –

14

使用内置的方法:

Model.attribute_names 
# => ["_id", "created_at", "updated_at", "name", "address"] 
相关问题