Ruby on Rails-验证和更新/创建多个对象

时间:2018-08-14 01:45:41

标签: ruby-on-rails postgresql validation ruby-on-rails-5

首先,我想做的是-我有一些传入参数,对于更新服务器上的对象来说可能很大(有时约有500个对象的属性值很正常)。

我的逻辑是这样的:

def create_objects(object_attribute_array)
    errors = []
    return if object_attribute_array.blank?

    # Client ids are generated on clients to help with objects that were actually already created on the server but not returned due to faulty network connections
    incoming_client_ids = object_attribute_array.pluck(:client_id)
    existing_objects = current_user.objects.where(client_id: incoming_client_ids)

    # commit array in transaction - if after_rollback, error panic mode
    object_attribute_array.each do |obj|
      if existing_objects.pluck(:client_id).include?(obj[:client_id])
        # update it conditionally based on update time by changing the incoming object parameters but do not save
      else
        # create, validate, add to transaction
      end
    end
  end

所以,我想做什么(我想?):

似乎在逻辑上我会先获取现有对象,使用传入参数覆盖任何现有对象信息,但还不将对象保存到数据库中。只需对其进行验证,然后将其保存在一组经过验证的对象中即可。 然后,新建并验证不存在的对象,并将它们也添加到数组中。从理论上讲,将所有对象保存在数组中会很顺利,因此我应该将其包装在一个事务中以进行单个数据库调用吗?

还是我应该尝试简单地一对一地保存数组对象,以便返回单个对象错误,但数据库事务不会对我回滚?

任何帮助都将不胜感激,我已经阅读了很多有关事务的书,并且对它们的工作方式很熟悉,但是我对验证->添加到内存中的数组->持久化的最佳实践并没有看到太多。 / p>

1 个答案:

答案 0 :(得分:2)

检出activerecord-import库以批量插入数据。它还支持验证(:validate选项)和更新现有记录(on_duplicate_key_update选项)。

https://github.com/zdennis/activerecord-import/wiki

https://github.com/zdennis/activerecord-import/wiki/On-Duplicate-Key-Update

原理是相同的:您形成ActiveRecord对象的数组,然后根据关联的记录将它们持久化到一个或几个查询中。