如何在mongoid / rails中收集一个字段?

时间:2013-10-17 01:41:04

标签: ruby-on-rails ruby mongodb mongoid

我有一个模特

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"}]

2 个答案:

答案 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,因为它只会返回不同的值,这对于填充下拉列表等更好。