为什么切片需要!上班?

时间:2017-03-23 16:27:40

标签: 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

1 个答案:

答案 0 :(得分:4)

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