ruby-on-rails - 为什么 slice 需要 !上类?

标签 ruby-on-rails ruby

我正在使用 slice 方法从另一个对象的属性创建一个新对象。

我觉得奇怪的是,在 MiniTest 中,打印出

user_group.attributes.slice(ArchivedUserGroup.attribute_names)

返回一个空数组。但是,使用 !(“bang”)可以工作并返回所有 user_group 属性。

有人可以告诉我为什么 slice 以这种方式工作吗?

      UserGroup.where(user_id: self.id).each do |user_group|
        ArchivedUserGroup.create(
          user_group.attributes.slice!(ArchivedUserGroup.attribute_names)
        )
      end

最佳答案

Hash#slice! 返回具有删除 元素的哈希,而 Hash#slice 返回选定 元素:

{ foo: 1, bar: 2 }.slice(:foo, :bar)
=> {:foo=>1, :bar=>2}
{ foo: 1, bar: 2 }.slice!(:foo, :bar)
=> {}

此外,slice!(带有爆炸声)会改变散列(通过删除非切片元素),因此按照惯例,此方法有爆炸声。

似乎您没有带有 ArchivedUserGroup.attribute_names 键的属性,所以 slice! 只返回 attributes

关于ruby-on-rails - 为什么 slice 需要 !上类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42981776/

相关文章:

ruby - 如何在 Debian 6 上安装 ruby

ruby-on-rails - 添加用户名以设计 rails 4

ruby-on-rails - Bundle Install on dev 给出了缺少生产 gem 的错误

ruby-on-rails - Rails 3.1 一个表单上的多个对象

ruby-on-rails - 只为 ruby​​ 1.9.2 安装一个 gem?

ruby - 如何测试数组中的所有项目是否相同?

ruby - 32 位 Ruby 编译在 Lion 上失败

ruby-on-rails - 在 Rails 3 中映射 from_plugin 路由

ruby-on-rails - 是否有可能发现 Ruby on Rails 应用程序中未使用哪些类?

ruby-on-rails - 混合使用 Ruby 和 bash 命令——mv 返回 "x and y are the same file"