我有一个表,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查询正在日志中写入。如何使这个更好?
答案 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
注意:如果您在模型中有回调,请务必小心。
或者您可以使用sidekiq
或rescue
在后台运行此功能。