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