4

我有一个模型

class MyClass
  include Mongoid::Document
  include Mongoid::Timestamps

  field :a, type: String
  field :b, type: String
  field :c, type: String
end

那么如何从 MyClass 集合中的所有对象中获取所有a-s、b-s 或c-s 作为列表/数组?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"}]
4

2 回答 2

5

MyClass.only(:a), 将所有其他字段返回为 nil,并且所选字段及其值...

你可以MyClass.pluck(:a)改用。但是你只能通过一个字段。

如果你想要多个字段,你可以这样做:

MyClass.only(:a,:b).map {|obj| [obj.a,obj.b]}
于 2013-10-17T06:02:31.937 回答
4

MyClass.distinct(:a)有时也比pluck它只返回不同的值更好,这对于填充下拉列表等更好。

于 2014-02-25T16:18:40.037 回答