Ruby 有人了解 ruby 2.0 的 collect! 和 map! 的区别么?

victor · 2014年01月19日 · 最后由 Ddl1st 回复于 2014年01月19日 · 4378 次阅读

从 Ruby 2 的文档看两个方法是一样的。但是实际使用中不是这样

class OptionValue < ActiveRecord::Base
  belongs_to :option_type, touch: true, inverse_of: :option_values
  has_and_belongs_to_many :variants
end
class Variant < ActiveRecord::Base
  has_and_belongs_to_many :option_values

  def options_text
    values = option_values.joins(:option_type)
    values.collect! do |ov|
      "#{ov.option_type.presentation}: #{ov.presentation}"
    end
    values.to_sentence({ words_connector: ", ", two_words_connector: ", " })
  end
end

这里如果把 values.collect! 替换成 values.map! 就报错

undefined method `map!' for #<OptionValue::ActiveRecord_AssociationRelation:0x007fd5175ba650>

我也查看了 Rails4 的 API。并没有扩展 map! 或者 collect! 方法。

环境:Ruby 2.0.0, Rails 4.1.0.beta1

PS: 我的 Dash 安装的是 Ruby 2.1 的文档,所以看的是 Ruby2.1 的文档对 map! 和 collect! 的解释。

这里方法调用的接受者不是 Array 对象,你可以试试 values.all.map! 试试

#1 楼 @lululau 修改之后报一样的错

undefined method `map!' for #<OptionValue::ActiveRecord_AssociationRelation:0x007fc850527888>

#1 楼 @lululau

values.collect! 可以改写成 values.to_a.map!

ActiveRecord::Relation 转换成数组要用 to_a 方法。

但是还是不清楚 collect! 和 map! 的区别

为啥 collect! 可以直接作用于 ActiveRecord::Relation 并把它当做 数组对象操作呢?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号