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,您将立即找到这两种方法.
看看那里,这是一个了解铁路可以做什么的好地方.
从文档中看不出来,但这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来说是这样。
| 归档时间: |
|
| 查看次数: |
2444 次 |
| 最近记录: |