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

baa*_*h05 9 activerecord ruby-on-rails

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

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

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

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

Cas*_*lho 10

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

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

Person.update(person_id, :user_name => 'New Name')
Run Code Online (Sandbox Code Playgroud)

缺点是你必须事先知道人的身份.

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

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

您可以像这样使用update_all:

Book.update_all "author = 'David'", "title LIKE '%Rails%'"
Run Code Online (Sandbox Code Playgroud)

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

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

Rails API链接


Tro*_*roy 5

从文档中看不出来,但这update_all是对这个问题的答案。

Book.where(id: 123).update_all(title: "War and Peace")
Run Code Online (Sandbox Code Playgroud)

结果恰好是一个查询:

UPDATE `books` SET `books`.`title` = "War and Peace" WHERE `books`.`id` = 123
Run Code Online (Sandbox Code Playgroud)

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

  • 对于 Rails 6 上的任何人 - 使用“update_all”。`update` 将触发 SELECT 查询 (2认同)