【问题标题】:How can I bulk save ActiveRecord Objects with validation in a fast way?如何快速批量保存带有验证的 ActiveRecord 对象?
【发布时间】:2015-06-17 18:51:17
【问题描述】:

我想快速保存 1000 个 ActiveRecord 模型。 我知道几个选项 e.b.使用 sql 批量导入 gem 或本机插入。但问题是这些解决方案不检查记录是否已经存在。 在保存记录之前,我肯定需要通过检查一些属性来检查该记录是否已经存在。目前我迭代并像这样保存

rate = Rate.find_or_create_by(
            :supplier_id => acc.supplier_id,
            :candidate_id => acc.id,
            :total => self.total,
            :catering => self.catering,
            :arrival => arrival,
            :departure => departure

        ) do |r|
          r.arrival = arrival
          r.departure = departure
          r.supplier_id = acc.supplier_id
          r.total = self.total
          r.currency = currency
        end

如何快速处理大量对象?

【问题讨论】:

标签: ruby-on-rails ruby activerecord


【解决方案1】:

find_or_create,虽然是一个方法,但实际上执行了两个 DB 查询。这不仅速度慢,甚至不能保证唯一性(可能性非常高)。 validates :uniqueness也是如此。

做你想做的事(保证唯一性)的最快方法可能是在数据库中构建UNIQUE 约束或索引。然后,在保存时,如果插入失败,Rails 将引发异常。这将防止重复记录,并且与标准轨道一样快。

如果您希望通过“Rails 方式”(循环记录,正如您已经在做的那样)提高速度,您需要变得有点棘手。从this article 开始,最快的方法是使用原始 SQL 中的所有记录构建单个插入,然后运行该语句。当然,这是基于保证在 rails 内不会创建任何重复记录。

【讨论】:

  • 出于性能原因,我也想到了原始 sql 插入。但我不想退出唯一约束。 postgres是否有可能只是跳过已经存在的记录并继续插入所有其他有效条目?
  • 也许,但这是一个 postgres 问题,而不是 Rails 问题。
  • 也就是说,你的问题的答案似乎是“否”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多