我无法使上述任何解决方案起作用(因为我不想为每个模型添加代码块和代码块,并且由于某种原因,attributes
模型实例上不存在该方法,对我来说。:/),所以我决定编写自己的助手来为我做这件事。请注意,此方法包括动态和预定义字段。
助手/mongoid_attribute_helper.rb:
module MongoidAttributeHelper
def self.included(base)
base.extend(AttributeMethods)
end
module AttributeMethods
def get_all_attributes
map = %Q{
function() {
for(var key in this)
{
emit(key, null);
}
}
}
reduce = %Q{
function(key, value) {
return null;
}
}
hashedResults = self.map_reduce(map, reduce).out(inline: true) # Returns an array of Hashes (i.e. {"_id"=>"EmailAddress", "value"=>nil} )
# Build an array of just the "_id"s.
results = Array.new
hashedResults.each do |value|
results << value["_id"]
end
return results
end
end
end
模型/用户.rb:
class User
include Mongoid::Document
include MongoidAttributeHelper
...
end
一旦我将上述包含 ( include MongoidAttributeHelper
) 添加到我想使用此方法的每个模型中,我可以使用User.get_all_attributes
.
当然,这可能不是最有效或最优雅的方法,但它确实有效。:)