【问题标题】:Ruby convert array of active records or objects into array of hashesRuby 将活动记录或对象数组转换为哈希数组
【发布时间】:2020-07-13 21:22:47
【问题描述】:

我有一个对象 Persons,它是一个 ActiveRecord 模型,其中包含一些字段,例如 :name、:age 等。

Person 与称为 Account 的东西之间存在一对一的关系,其中每个人都有一个帐户。

我有一些代码:

   Account.create!(person: current_person)

其中 current_person 是指定的现有 Person 活动记录对象。

注意:表 Account 有一个字段为 person_id 并且他们两个在模型中都有 has_one。

现在我相信我们可以像下面这样进行批量创建:

 Account.create!([{person: person3},{person:: person2} ....])

我有一个 persons 数组,但不确定转换为所有具有相同键的哈希数组的最佳方法。

基本上Convert array of hashes to array的反面是我想做的。

【问题讨论】:

    标签: arrays ruby-on-rails ruby activerecord hash


    【解决方案1】:

    为什么不直接遍历你的对象数组呢?

    [person1, person2].each{|person| Account.create!(person: person)}
    

    但是如果由于任何原因您循环的任何项目失败Account.create!,您可能会处于错误状态,因此您可能希望将其包装在Active Record Transaction 中。

    ActiveRecord::Base.transaction do
      [person1, person2].each{|person| Account.create!(person: person)}
    end
    

    【讨论】:

    • 在我当前循环的解决方案中,我认为批处理可能有助于更快地运行查询,这就是为什么我想使用批量创建 API,因为我认为它可以处理您为我提到的事务部分??
    • @PrasaanthNeelakandan 在这个循环中写入了什么数据?您需要在剪辑中记录多少条记录?如果这是您的目标,但不是您在问题中提出的问题,还有其他方法可以提高性能。
    • 我想一起写大约 50 个数据条目,就像分批一样。写入只写一个字段。
    【解决方案2】:

    create 方法实际上单独保存每个哈希,如source code 所示,因此可能不是您要查找的内容。无论哪种方式,以下代码都可以完成这项工作:

      Account.create!(persons.map { |person| Hash[:person_id, person.id] })
    

    如果您需要在同一个数据库操作中创建所有记录并且使用的是 rails 6+,您可以使用 insert_all 方法。

      Account.insert_all(persons.map { |person| Hash[:person_id, person.id] })
    

    对于以前版本的 Rails,您应该考虑使用 activerecord-import gem。

      # Combination(1).to_a converts [1, 2, 3] to [[1], [2], [3]]
      Account.import [:person_id], persons.pluck(:id).combination(1).to_a
    

    【讨论】:

    • 谢谢。这似乎更好。
    猜你喜欢
    • 2018-04-28
    • 2017-12-10
    • 2021-10-16
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多