2011-08-10 26 views
17

Tôi đang xây dựng hệ thống phụ trợ, như được viết trong hướng dẫn của Iain Hecker: http://iain.nl/backends-in-rails-3-1 và tôi cố gắng thích ứng với MongoDB bằng Mongoid.Làm thế nào tôi có thể nhận được tất cả các tên trường của Tài liệu Mongoid?

Vì vậy, khi tôi cần phải viết trong backend/resourse_helper.rb

module Backend::ResourceHelper 

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

end 

tôi nhận được lỗi sau:

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

(tôi bắt nguồn từ phụ trợ để "backend/người dùng # index"). Backend :: tài khoản được thừa hưởng từ tài khoản:

class User 
    include Mongoid::Document 

    devise_for :users 

    field :name 
    field :address 
end 

tôi chỉ cần một danh sách các lĩnh vực cho người dùng mà: Class, như tôi đoán (ví dụ: [ "email", "tên", "địa chỉ", ... ]), nhưng tôi đã phá vỡ đầu của tôi cố gắng tìm cách.

Trả lời

30

Mongoid đã cung cấp cho bạn các thuộc tính cho một đối tượng :

Model.new.attributes 

Để lấy tên f hoặc các thuộc tính này:

Model.fields.keys 
+0

Dựa trên bối cảnh của ví dụ đã cho, cũng như thông báo lỗi được báo cáo, tôi giả định rằng Yuri đang làm việc với một lớp ở đây, không phải là một ví dụ. nếu đó là sự thật, yêu cầu anh ta để nhanh chóng lớp học có vẻ không cần thiết. – bloudermilk

+0

@Bloudermilk: Đúng vậy. Tôi đã cập nhật câu trả lời này để sử dụng 'Model.fields.keys', vì nó sẽ trả lại các trường đúng. –

+0

Cảm ơn bạn, Ryan! Giải pháp của bạn làm việc cho tôi. Tôi đã gỡ bỏ Backend :: User và đã viết 'a = []; resource_class.all.collect {| r | r.fields.keys.each {| k | một << k}}; a.uniq -% w (_id _type created_at updated_at encrypted_password) '. Bạn không biết làm thế nào tôi có thể refactor chuỗi này? Tôi hơi mới với ruby) –

1

Bạn đang đi đúng hướng với attribute_names. Tôi nghĩ bạn chỉ cần đảm bảo rằng bạn đang đưa mô-đun của mình vào đúng nơi. Ví dụ, nếu bạn có cùng một module:

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

lớp học của bạn sẽ giống như vậy:

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

    devise_for :users 

    field :name 
    field :address 
end 

Sau đó gọi User.attributes nên trở ["name", "address"]

+0

Không, điều đó không làm việc, nó sẽ trả cùng 'phương pháp undefined' thuộc tính Xây Dựng Quan Hệ Class'. –

+0

Nếu bạn * bao gồm * 'Backend :: ResourceHelper' thì phương thức' attributes' sẽ không xuất phát từ đó. Bao gồm một mô-đun vào một lớp sẽ làm cho các phương thức của mô-đun đó có sẵn trên các cá thể của lớp, chứ không phải chính lớp đó. –

+0

Cảm ơn bạn, Ryan. Tôi nên viết 'extend' (cập nhật). Ngoài ra, câu trả lời của tôi cho rằng Yuri đang làm việc với lớp. Yêu cầu khởi tạo của lớp sẽ là một giải pháp không hợp lý, IMO. – bloudermilk

3

Một điều cần lưu ý là Model.fields.keys sẽ chỉ liệt kê các khóa trường được xác định trong lớp Mô hình. Nếu bạn sử dụng các trường động, chúng sẽ không được hiển thị. Model.attributes.keys cũng sẽ bao gồm các khóa thuộc tính cho bất kỳ trường động nào bạn đã sử dụng.

+0

'Model.attributes.keys' không hoạt động và ném lỗi' undefined method attributes''. –

14

Sử dụng được xây dựng trong phương pháp:

Model.attribute_names 
# => ["_id", "created_at", "updated_at", "name", "address"] 
Các vấn đề liên quan