Relation#update(id, attributes)
文档提到“不管对象是否成功地保存到数据库中,结果对象都会被返回”,而Relation#update_all(updates, conditions = nil, options = {})
声明没有实例化、回调或验证(直接的DB查询)。
运行一个简单的性能测试并将Relation#update
替换为Relation#update_all
,看起来内存消耗增加了。
有什么解释吗?
节选:
#Before
MyModel.update(my_hash['id'], special_attrs)
#After (more memory consumed)
MyModel.where(:id => my_hash['id']).update_all(special_attrs)
#Update-2 (slightly more memory consumed than with update(id, attrs)
MyModel.update_all(special_attrs, {:id => my_hash['id']})
update -一些用于比较的基本数字:对于触发的大约700个update语句,差异约为0.6MB (每条语句0.8kB)
UPDATE 2 -按照@philip建议删除了AREL链接。内存占用略有减少,但MyModel.update_all(attrs, conditions)
比MyModel.update(id, attrs)
消耗更多的内存。
发布于 2012-11-02 00:33:49
如果你这样做有什么区别吗?
MyModel.update_all(special_attrs, {:id => my_hash['id']})
我没有挖太远,但看起来update_all马上就把阿雷尔叫来了。我停止了对.update -> .update_attributes -> .assign_attributes
的照顾,完全没有看到Arel,尽管我确信它一定会在某一时刻发挥作用。
如果我不得不猜的话,我会说这就是原因。
我想这是在一个循环的某处?否则,为什么不直接做:
MyModel.update_all(special_attrs, {:id => all_my_hash_ids_as_an_array})
https://stackoverflow.com/questions/13182644
复制相似问题