2017-03-23 33 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