Rails 4:从模型实例中选择多个属性

Dre*_*ker 1 ruby activerecord ruby-on-rails

如何从模型实例中获取多个属性,例如

Resource.first.attributes(:foo, :bar, :baz)
# or
Resource.where(foo: 1).fetch(:foo, :bar, :baz)
Run Code Online (Sandbox Code Playgroud)

而是返回所有属性并手动选择它们.

Aru*_*hit 7

您将使用该方法slice.

切片哈希仅包含给定的键.返回包含给定键的哈希.

你的代码将是.

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

  • `attributes`将属性名称作为字符串返回,而不是符号. (2认同)

Dan*_*ani 6

怎么样pluck

Resource.where(something: 1).pluck(:foo, :bar, :baz)
Run Code Online (Sandbox Code Playgroud)

其翻译为以下 SQL:

SELECT "resources"."foo", "resources"."bar" FROM, "resources"."baz" FROM "resources"
Run Code Online (Sandbox Code Playgroud)

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

[["anc", 1, "M2JjZGY"], ["Idk", 2, "ZTc1NjY"]] 
Run Code Online (Sandbox Code Playgroud)

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 }
    
    Run Code Online (Sandbox Code Playgroud)