2017-03-23 57 views
1

我正在使用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 

回答

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

+0

你可以更新第一个代码块与爆炸 – VegaStudios