【发布时间】:2012-03-26 02:15:02
【问题描述】:
我想更改一条记录,但我不想先从数据库中读取它,因为坦率地说我不明白这一点。它很大,而且通过一个缓慢而昂贵的网络。 可以(轻松)完成吗?
假设我有一条包含 100 个字段的记录(为了参数),我想更改表中的一个字段。我与数据库的连接非常糟糕(这是真的),因为它位于不同的盒子上,我无法改变它。 现在我拉下记录,rails 验证它的内容(因为我有序列化位)然后我更改一个字段(根据 X 条件的一百个字段之一)并再次保存记录。我想这会将整个记录再次写入数据库,而不知道我只更改了一点点。 (最后一点是假设)
现在要更改一条记录,它会通过网络发送大量数据,而我可能只更改了一件小事。 它还在数据库上执行两个查询。首先选择 * 然后更新..
所以我的问题.. 是否有更聪明的基类可以做到这一点,无需阅读即可编写?
在我的脑海中,我认为每个字段都有一个 setter 方法,并带有一个用于更改的 bool 标志。
保存时,走标志,哪里是真的......现在会发生这种情况吗,如果是,我该如何使用它?
【问题讨论】:
-
“(最后一点是假设)”——这是一个错误的假设。 ActiveRecord 足够聪明,只能写入更改的值。它内部已经有标记来跟踪哪些字段发生了变化。
-
实际上,查看文档(称为“部分更新”顺便说一句)它实际上只在边缘导轨中,直到 Rails 4 才发布。可能有一个“部分更新”插件或 gem .
-
是的,它是一个智能更新。关于首先进行查找,如果您知道要更新的内容,那么查找具有其 ID 的记录不是一个恒定时间操作吗?数据库可能有多大?
-
@Shaunak 这不是我有问题的发现。它是从一个糟糕的服务器通过一个糟糕的网络读取程序内存。根本就是阅读记录,因为我不关心里面有什么。除了恒定之外,我认为它从来都不是我可以接受的。只有在我需要进行操作时才能进行恒定时间操作...否则我不妨在每行代码之后接受 sleep(100)。
标签: ruby-on-rails activerecord