[英]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
幾點注意事項:
pluck
,因此如果您使用的是 Rails 3,它將無法工作。pluck
是在 ActiveRelation 上定義的,而不是在單個實例上定義的。 如果您希望結果是每條記錄的屬性名稱 => 值的哈希值,您可以通過執行以下操作來zip
結果:
attrs = [:foo, :bar, :baz] Resource.where(something: 1).pluck(*attrs).map{ |vals| attrs.zip(vals).to_h }
has_one
或belongs_to
關系,而不僅僅是靜態屬性。 要獲取多個關系,例如has_one
或belongs_to
,您可以直接在實例上使用slice
,使用values
來獲取值,然后使用map
或collect
操作它們。
例如,要獲取一book
的category
和author
,您可以執行以下操作:
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.