2016-02-05 53 views
0

如何从模型实例中获取多个属性, G。Rails 4:从模型实例中选择多个属性

Resource.first.attributes(:foo, :bar, :baz) 
# or 
Resource.where(foo: 1).fetch(:foo, :bar, :baz) 

而不是然后返回所有的属性,并手动选择它们。

+0

什么是你预期的结果?有'name => value'对的散列或只包含这些值的数组? – Stefan

+0

@Stefan我希望得到一个散列结果 – DreamWalker

回答

5

您将使用方法slice

将散列切片以仅包含给定的键。返回包含给定键的散列。

您的代码将会是。

Resource.first.attributes.slice("foo", "bar", "baz") 
# with .where 
Resource.where(foo: 1).select("foo, bar, baz").map(&:attributes) 
+2

'属性'返回属性名称作为字符串,而不是符号。 – Stefan

+0

@Stefan谢谢。没有注意到那件事。 –

3

如何pluck

Resource.where(something: 1).pluck(:foo, :bar, :baz) 

它转换为下列SQL:

SELECT "resources"."foo", "resources"."bar" FROM, "resources"."baz" FROM "resources" 

,并返回每个在关系中的记录指定的列值的数组:

[["anc", 1, "M2JjZGY"], ["Idk", 2, "ZTc1NjY"]] 

http://guides.rubyonrails.org/active_record_querying.html#pluck

夫妇的注意事项:

  • 多重价值pluck支持Rails中4开始,所以如果你用Rails 3将无法正常工作。
  • pluck是在ActiveRelation上定义的,而不是一次性定义的。
  • 如果你想要得到的结果是属性名=>值的散列为每个记录,你可以通过执行类似下面zip结果:

    attrs = [:foo, :bar, :baz] 
    Resource.where(something: 1).pluck(*attrs).map{ |vals| attrs.zip(vals).to_h } 
    
+0

有用的指导,但我需要'key => value'对来获得结果。 – DreamWalker

+0

你说得对,我已经添加了关于将结果映射到散列的注释。 – Dani