Rails:如何增加模型选定实例的整数字段?

2024-04-22

Buyer模型有两个字段:

  • 名称(字符串)
  • 位置(整数)

我想增加position在所有买家中position >= N.

最简单的方法是什么?

是否可以仅使用一个查询来实现这一目标?


你可以使用:

Buyer.update_all("position = position + 1", ["position >= ?", n])

如果 n = 25,这将生成查询:

UPDATE "buyers" SET position = position + 1 WHERE (position >= 25)

Edit:

由于您有独特的数据库约束,因此您有几个选择。对于这两个选项,我建议在事务中运行它们。首先,您可以以相反的顺序单独更新每个字段,但这将导致您进行 N+1 次查询。对于小型数据集,这不会是问题,但对于较大的数据集,这可能会影响性能。

Buyer.transaction do
   Buyer.select("id, position").where(["position >= ?", n]).order("position DESC").each do |buyer|
      buyer.position += 1
      buyer.save
   end
end

为了避免 N+1 查询,另一个选项是将位置增量更改为 100(或 10)。这将允许您更新两个查询中的位置,而不是 N+1。因此,位置不再是 1、2、3 等,而是 100、200、300 等。然后要进行更新,请将所有值增加 101,然后在更新后进行更新以减去 1。

Buyer.transaction do
   Buyer.where(["position >= ?", n]).scoping do
      Buyer.update_all("position = position + 101")
      Buyer.update_all("position = position - 1")
   end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails:如何增加模型选定实例的整数字段? 的相关文章

随机推荐

  • 计算数组的平均值

    我想使用数组计算平均数 我希望程序询问成绩的数量 然后我想输入成绩数字 在我想获得平均输出之后double 到目前为止 这是我的代码 public class Average public static void main String a
  • 使用 purrr::map 将多个数据帧写入 csv 文件 [重复]

    这个问题在这里已经有答案了 PROBLEM 我有一个数据帧列表 应将其作为 csv 文件写入磁盘 假设这是数据框列表 dfs lt list iris mtcars 什么没有奏效 我尝试像这样构建正确的文件名 但它不起作用 dfs gt m
  • 如何在AWS Lambda中模拟multiprocessing.Pool.map()?

    AWS Lambda 上的 Python 不支持multiprocessing Pool map 如记录在这另一个问题 https stackoverflow com questions 34005930 multiprocessing s
  • Breeze 使用 DB EntityType 管理 NODB EntityType

    我正在使用 Papa 的课程 CCJS 代码来研究 Breeze js 和 SPA 使用此代码 我尝试管理来自服务器的附加信息 但这不是来自 EntityFramework 的元数据中包含的实体 所以我创建了一个名为 Esto 的 NO D
  • 循环直到在表中找到 2 个特定值?

    我试图找到一种更聪明的方法来解决这个问题 这是与游戏相关的代码的摘录 它循环遍历每个背包的每个插槽 直到找到铲子和绳子 local continue local foundShovel foundRope for i 0 Container
  • 错误:无法安全地评估递归定义模块的定义

    我很想了解为什么会发生此错误以及解决该错误的最佳方法是什么 我有几个文件types ml and types mli它定义了一个变体类型value可以是许多不同的内置 OCaml 类型 float int list map set 等 由于
  • 使用 aes_256_cbc 密码加密时的默认 IV 是多少?

    我在一个文件中生成了一个随机 256 位对称密钥 用于使用 OpenSSL 命令行加密一些数据 稍后我需要使用 OpenSSL 库以编程方式解密该数据 我没有成功 我认为问题可能出在我正在使用 或没有使用 的初始化向量中 我使用以下命令加密
  • Codeigniter 3.0.4 在我的服务器上出现 404 Page Not Found 错误

    我是 codeigniter 的新手 在我的本地主机上开发一个网络应用程序后 我将我的网站上传到服务器上 然后导入我的数据库 之后我更改了database php文件中的数据库设置 并且我还更改了config php文件中的基本url 我得
  • 使用宏将word文档中的公式转换为图像

    我有这个宏可以将文档中的所有形状转换为图像 Dim i As Integer oShp As Shape For i ActiveDocument Shapes Count To 1 Step 1 Set oShp ActiveDocume
  • MVVM 层次结构中的更改通知

    假设在某个抽象 ViewModel 基类中 我有一个普通的旧属性 如下所示 public Size Size get return size set size value OnPropertyChanged Size 然后 我创建一个更具体
  • 将字符串转换为时间并在 golang 中解析

    我正在从文件中读取时间戳 并将该值分配给t t 2016 11 02 19 23 05 503705739 0000 UTC 当我尝试解析字符串时 time err time Parse 2016 11 02 19 18 57 149197
  • RxSwift 订阅块未调用

    我正在玩 RxSwift 但我被一个简单的玩具程序困住了 我的程序本质上包含一个模型类和一个视图控制器 该模型包含一个可观察对象 该可观察对象在异步网络调用之后在主队列上更新 视图控制器在 viewDidLoad 中订阅 AppDelega
  • php mysql pdo 连接不会在不破坏语句处理程序的情况下关闭

    我想在我的 php 脚本中显式关闭 mysql 连接以防止连接过多 使用以下代码 不加 sth 空 在上面的代码中 我无法关闭我的 mysql 连接 正如 PDO 文件中所述 要关闭连接 您需要通过确保销毁该对象 删除所有剩余的引用 为了确
  • 关于 jsch 中 sudo su - 用户的想法

    我在 jsch 中使用 sudo su 时遇到问题 下面是我的帖子 exec java package com test import com jcraft jsch import java awt import javax swing i
  • SQL Server返回代码-6,是什么意思?

    我有一个没有任何问题的存储过程 即返回代码为 0 在某些情况下 我会引发用户定义的错误 gt 50000 在这些情况下 回报是 6 我只是好奇 6 是什么意思 我没有在程序中设置返回码 因此这个数字是SQL Server 系统 生成的 我发
  • build.xml 将日期和时间设置为文件名

    我想设置带有日期和时间的文件名 因此我想创建名为的文件behat 20140913 195915 html但是下面的示例将名称设置为behat yyyymmdd hhiiss html 有人知道问题的解决办法吗 我跟着这个例子 http a
  • 带功能区的 Spring Cloud 不会忽略关闭的服务器

    我正在遵循有关尤里卡客户端负载平衡的 Spring 指南 https spring io guides gs client side load balancing https spring io guides gs client side
  • 如何从ajax加载数据到zabuto日历插件?

    作为标题 我尝试将数据从 ajax 加载到 zabuto 日历 但似乎不起作用 参考 zabuto 日历http zabuto com dev calendar examples show data html 我想在单击上个月或下个月的导航
  • 日历应该用表格来表示吗?为什么 Google 日历只使用表格作为列?

    这不是另一个一般的 一般布局的表格与 div 元素 类型的问题 例如 为什么不使用表格来布局 https stackoverflow com questions 83073 why not use tables for layout in
  • Rails:如何增加模型选定实例的整数字段?

    Buyer模型有两个字段 名称 字符串 位置 整数 我想增加position在所有买家中position gt N 最简单的方法是什么 是否可以仅使用一个查询来实现这一目标 你可以使用 Buyer update all position p