我有一个模特
class MyClass
include Mongoid::Document
include Mongoid::Timestamps
field :a, type: String
field :b, type: String
field :c, type: String
end
那么如何将所有a
- s,b
- s或c
- s作为MyClass集合中所有对象的列表/数组? Rails / Ruby / Mongoid是否有任何语法糖?
我知道,有可能这样做:
all_a = []
MyClass.desc(:created_at).each do |my_object|
all_a.push(my_object.a)
end
但我想到了:
MyClass.get(:fields => :a)
MyClass.get(:fields => :a,:b)
我找到了一些东西:
MyClass.create(a: "my_a_string")
MyClass.create(a: "my_another_a_string")
现在:
MyClass.only(:a)
应该有效,但我得到了:
=> #<Mongoid::Criteria
selector: {}
options: {:fields=>{"a"=>1}}
class: MyClass
embedded: false>
MyClass.only(:a).to_a
=> [#<MyClass _id: 525f3b9e766465194b000000, created_at: nil, updated_at: nil, a: "my_a_string", b: nil, c: nil>, #<MyClass _id: 525f4111766465194b180000,
created_at: nil, updated_at: nil, a: "my_another_a_string", b: nil, c: nil>]
但我想到了:
["my_a_string", "my_another_a_string"]
或
[{a: "my_a_string"}, {a: "my_another_a_string"}]
答案 0 :(得分:5)
MyClass.only(:a)
,将每个其他字段返回为nil,并将所选字段及其值返回...
您可以改用MyClass.pluck(:a)
。
但是你只能传递一个字段。
如果您想要多个字段,可以执行以下操作:
MyClass.only(:a,:b).map {|obj| [obj.a,obj.b]}
答案 1 :(得分:4)
MyClass.distinct(:a)
有时也优于pluck
,因为它只会返回不同的值,这对于填充下拉列表等更好。