我使用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
答案 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
。