首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4批量更新模型数组

Rails 4批量更新模型数组
EN

Stack Overflow用户
提问于 2017-08-07 13:02:05
回答 2查看 983关注 0票数 2

我有一个ActiveRecord模型数组,我想重编号一个列并批量更新它们。代码如下:

代码语言:javascript
复制
rules = subject.email_rules.order(:number)
rules.each_with_index do |rule, index|
  rule.number = index + 1
end

EmailRule.update(rules.map(&:id), rules.map { |r| { number: r.number } })

但是这会创建N个SQL语句,我想要1,有什么方法可以做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-07 13:46:41

假设您正在使用postgres,您可以使用row_number和看起来有点奇怪的更新/从结构。这是基本版本:

代码语言:javascript
复制
UPDATE email_rules target 
SET number = src.idx
FROM (
  SELECT 
    email_rules.id,
    row_number() OVER () as idx
    FROM email_rules
) src
WHERE src.id = target.id

您可能需要在subject上对此进行详细分析,当然还需要包含按数字排序的顺序,如下所示:

代码语言:javascript
复制
UPDATE email_rules target 
SET number = src.idx
FROM (
  SELECT 
    email_rules.id,
    row_number() OVER (partition by subject_id) as idx
    FROM email_rules
    ORDER BY number ASC
) src
WHERE src.id = target.id

(假设subject_id是关联主题/email_rules的外键)

票数 2
EN

Stack Overflow用户

发布于 2017-08-07 13:25:28

您可以选择的一种方法是将所有交互都放在一个事务中,它至少会在事务结束时进行一次提交,从而使其速度更快。

代码语言:javascript
复制
ActiveRecord::Base.transaction do
  ...
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45547580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档