是否可以在没有首先阅读的情况下更改轨道中的记录

时间:2012-03-26 02:15:02

标签: ruby-on-rails activerecord

我想改变一条记录,但我不想先把它从数据库中读出来,因为坦率地说我没有看到这一点。它非常庞大,而且网络速度慢而且价格昂贵。 可以(轻松)完成吗?

假设我有100个字段的记录(为了参数),我想改变表中的一个字段。我与数据库的连接非常糟糕(这是真的),因为它位于一个不同的盒子里,我无法改变这一点。 现在我拉下记录并且rails验证其内容(因为我有序列化的位)然后我改变一个字段(取决于X条件的一百个)并再次保存记录。我想这会将整个记录再次写入数据库,而不知道我只改变了一小部分。 (最后一位是假设)

现在改变一条记录,它正在通过网络发送大量数据,而且可能是我只改变了一个小小的东西...... 它还在数据库上进行两次查询。首先是select *然后是更新..

所以我的问题..是否有更聪明的基类,这样做是正确的,没有读取写? 我会想到每个字段的setter方法都会改变bool标志。 保存时,走旗帜,哪里是真的......现在是否会发生这种情况,如果是这样,我该如何使用呢?

2 个答案:

答案 0 :(得分:9)

Rails模型具有update方法,该方法执行SQL选择,然后执行SQL更新。

它的使用很简单(假设你有一个名为Person的模型)

Person.update(person_id, :user_name => 'New Name')

缺点是你必须事先知道这个人的身份。

但是,接下来,您将始终需要进行查询才能找到答案。您可以编写自己的SQL来更改列值,使用WHERE子句搜索您拥有的参数。

Rails模型具有update_all方法,该方法仅在不加载数据的情况下执行SQL更新。 但我不建议使用它,因为它不会触发您的模型可能具有的任何回调或验证。

您可以像这样使用update_all:

Book.update_all "author = 'David'", "title LIKE '%Rails%'"

ps:示例全部来自Rails官方文档。如果您搜索更新或update_all,您将立即找到这两种方法。

看看那里,这是一个了解铁路可以做什么的好地方。

Rails API link

答案 1 :(得分:3)

文档中并不明显,但update_all是这个问题的答案。

Book.where(id: 123).update_all(title: "War and Peace")

只产生一个查询:

UPDATE `books` SET `books`.`title` = "War and Peace" WHERE `books`.`id` = 123

自问这个问题以来已经有一段时间了,但 Rails 4 就是这样。