如何快速批量保存ActiveRecord对象并进行验证?

时间:2015-06-17 18:51:18

标签: ruby-on-rails ruby activerecord

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

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

如何通过大量对象快速实现这一目标?

1 个答案:

答案 0 :(得分:1)

find_or_create,虽然单个方法,实际上执行两个数据库查询。这不仅缓慢,甚至不是唯一性的保证(只是非常高的可能性)。 validates :uniqueness也是如此。

执行所需操作(保证唯一性)的最快方法可能是在数据库中构建UNIQUE约束或索引。然后,在保存时,如果插入失败,Rails将引发异常。这样可以防止重复记录,也可以像标准轨道一样快。

如果你希望速度提升超过“Rails方式”(循环记录,就像你已经在做的那样),你需要有点棘手。从this article开始,最快的方法是在原始SQL中构建包含所有记录的单个插入,然后运行该语句。当然,这是基于保证在轨道内你没有创建任何重复记录。