2016-02-05 35 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