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

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

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

我的逻辑是这样的:

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

那么,我想做什么(我想?):

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

或者我实际上应该尝试简单地一个接一个地保存数组对象,以便返回单个对象错误,但数据库事务不会回滚给我吗?

非常感谢任何帮助,我已经阅读了很多关于事务的文章并且熟悉它们的工作方式,但是我没有看到很多关于验证 -> 添加到内存中的数组 -> 持久化的最佳实践。

最佳答案

查看 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 对象数组,然后根据相关记录将它们保存在一个或几个查询中。

关于ruby-on-rails - Ruby on Rails - 验证和更新/创建多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51832659/

相关文章:

ruby-on-rails - 如何使用 bootstrap-social 中的按钮创建正确的链接以通过 Facebook 登录

ruby-on-rails - SCSS 文件中的 Rails 3.1 资源 url 似乎没有正确引用资源

sql - 按最匹配的记录排序

ruby-on-rails - Rails ActiveAdmin “f.inputs, except: [:belong_to field]” 不起作用

jquery - 在 Rails 中使用 PJax 加载 Doc Ready 上的所有 jQuery 变量

postgresql - 如何将 postgres 中的默认值 ksuid 赋予列? postgres 中有 ksuid 的替代品吗?

postgresql - Postgres : More verbose error message: I am missing the table name

Angular 模板验证表单

validation - 如何验证主机名(可能是 IP)和端口号(CString)

c++ - 已经处理后如何检查cin?