Rails 中的 map(&:id) 是什么?

What is map(&:id) in Rails?

我的问题不是错误,是为了理解。由于我是 Rails 的新手,我还不能阅读所有代码。

  1. (&:id).map

    之后做什么
    @user_cnae_classifications = user.cnae_classifications.map(&:id)
    

    .map有和没有的区别是什么?

  2. 在此方法中调用:

    UserCnaeClassification.create(
      user: @user,
      cnae_classification_id: id
    )
    

    我如何阅读那部分代码...

    user: @user,
    cnae_classification_id: id
    

    它们是键和值吗?

1) 您应该阅读 map 上的一些教程以熟悉。 https://www.rubyguides.com/2018/10/ruby-map-method

但简短的回答是 运行 user.cnae_classifications.map(&:id) 将遍历所有 cnae_classifications 并从中提取 id 并将它们全部放入一个数组中。 & 字符允许 map shorthand 避免传递整个块。

来自上面的link:

2) #create 方法可以接受已知属性的 key-value 散列(所讨论的 class 已知,在本例中为 UserCnaeClassification)以在创建时分配。所以你基本上是对的,它们是 key-value 对,但它们特定于此 class/object。这些相同的键可能不适用于另一个 class/object。 补充阅读:https://guides.rubyonrails.org/active_record_basics.html#create

.map(&:id).map { |x| x.id } 的较长形式的 shorthand。

  1. what does (&:id) do after .map

语法 map(&:method) 等同于:

object.map do |i|
   i.method
end

完整的解释是&运算符用于将任何响应to_proc的Ruby对象转换为Proc,封装了一段代码.在这种情况下,Symbol 对象 (:id) 被转换为上面的代码块。

如果您有兴趣了解更多,请注意这是 纯 Ruby,而不是 Rails-specific。 Check the documentation for Proc.

  1. In this method call: How do I read that part of the code... are they keys and values?

这些是关键字参数。这是一种命名方法参数的方法,可以明确告诉 reader 每个值应该是什么。请注意,接受散列作为关键字参数的方法的行为已被弃用,as seen in this official post.

一些有趣的事情要说:如果您正在使用数据库(ORM - ActiveRecord),您会发现编写 map(&:id) 可能会有所帮助。还有一种叫做 pluck 的方法,它可以做类似的事情,但速度要快一些。

用法: 另外 pluck 不适用于常规数组。