如何在直接postgresql中编写这个ruby rake任务?

时间:2015-10-14 14:51:19

标签: sql ruby-on-rails ruby postgresql rake

这是rake任务:

task :map_comment_to_user => :environment do
    Comment.all.each do |c|
      a         = Admin.where(mongo_id: c.mongo_user_id).first
      u         = User.where(email: a.email).first
      c.user_id = u.id
      c.save
    end
  end

我从Admin =>搞砸了一次迁移用户表和唯一的电子邮件允许我将它们拼接在一起。但它太慢了。

如何在直接PSQL中编写上述内容?

UPDATE comments c 
SET c.user_id = u.id 
FROM users u admins a 
WHERE c.mongo_user_id == a.mongo_id 
  AND u.email = a.email; ???

2 个答案:

答案 0 :(得分:1)

你的SQL非常接近。它只需要进行一些小的语法更改。

UPDATE comments c
SET user_id = u.id
FROM users u, admins a
WHERE c.mongo_user_id = a.mongo_id
  AND u.email = a.email;

答案 1 :(得分:0)

这可以为您节省大量的对象初始化成本并为您加速。

Comment.select(:id,:user_id).each do |c|
  email = Admin.where(mongo_id: c.mongo_user_id).pluck(:email).first
  uid = User.where(email: email).pluck(:id).first
  c.user_id = uid
  c.save
end