簡體   English   中英

Rails 4:從模型實例中選擇多個屬性

[英]Rails 4: select multiple attributes from a model instance

如何從模型實例中獲取多個屬性,例如

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

而不是返回所有屬性並手動選擇它們。

您將使用方法slice

對哈希進行切片以僅包含給定的鍵。 返回包含給定鍵的哈希。

你的代碼將是。

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

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

幾點注意事項:

  • 從 Rails 4 開始支持多值pluck ,因此如果您使用的是 Rails 3,它將無法工作。
  • pluck是在 ActiveRelation 上定義的,而不是在單個實例上定義的。
  • 如果您希望結果是每條記錄的屬性名稱 => 值的哈希值,您可以通過執行以下操作來zip結果:

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

獲取多個has_onebelongs_to關系,而不僅僅是靜態屬性。

要獲取多個關系,例如has_onebelongs_to ,您可以直接在實例上使用slice ,使用values來獲取值,然后使用mapcollect操作它們。

例如,要獲取一bookcategoryauthor ,您可以執行以下操作:

book.slice( :category, :author ).values 
#=> #<Category id: 1, name: "Science Fiction", ...>, #<Author id: 1, name: "Aldous Huxley", ...>

如果要顯示這些字符串的值,可以使用to_s ,例如:

book.slice( :category, :author ).values.map( &:to_s )
#=> [ "Science Fiction", "Aldous Huxley" ]

您可以使用join進一步操作它們,例如:

book.slice( :category, :author ).values.map( &:to_s ).join( "➝" )
#=> "Science Fiction ➝ Aldous Huxley"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM