需要创建多个记录而不是每个记录

时间:2016-06-16 01:52:31

标签: ruby-on-rails ruby ruby-on-rails-3 postgresql

我有一个表,JobTypePresetting,我发现很少列不为空

jtp = JobTypePresetting.arel_table
JobTypePresetting.where(jtp[:comment_text_id].not_eq(nil).or(jtp[: part_listing_id].not_eq(nil)))

我得到的记录很少,我需要在其他表中创建这些记录

所以我在其他表中找到了预置ID,如

avl_presetting_ids = JobEntry.where(job_id: params["job_id"], job_type_id: params["job_type_id"], template_id: params["template_id"]).pluck(:job_type_presetting_id)

如果预设ID不可用,则匹配并创建记录,如

  unless avl_presetting_ids.include?(presetting.id)
    JobEntry.create(job_id: params["job_id"], job_type_id: params["job_type_id"], template_id: params["template_id"],
                    job_type_presetting_id: presetting.id, comment_text_id: presetting.comment_text_id, part_listing_id: presetting.part_listing_id,
                    quantity: presetting.quantity, price: presetting.price, extension: presetting.extension)
  end

这在加载前在控制器中发生,因此许多sql查询正在日志中写入。如何使这个更好?

1 个答案:

答案 0 :(得分:0)

看一下upsert gem。

使用批处理模式。如果avl_presetting_ids列上有唯一索引,则无需查找job_type_presetting_id。重复的记录将被忽略。

jtp = JobTypePresetting.arel_table
presettings = JobTypePresetting.where(
    jtp[:comment_text_id].not_eq(nil).
        or(jtp[:part_listing_id].not_eq(nil))
)

job_attr = JobEntry.new.attributes.symbolize_keys

Upsert.batch(JobEntry.connection, JobEntry.table_name) do |upsert|
  presettings.each do |presetting|
    attr = job_attr.merge(job_id: params["job_id"],
                          job_type_id: params["job_type_id"],
                          template_id: params["template_id"],
                          job_type_presetting_id: presetting.id,
                          comment_text_id: presetting.comment_text_id,
                          part_listing_id: presetting.part_listing_id,
                          quantity: presetting.quantity,
                          price: presetting.price,
                          extension: presetting.extension)
    upsert.row(attr)
  end
end

注意:如果您在模型中有回调,请务必小心。

或者您可以使用sidekiqrescue在后​​台运行此功能。