ruby-on-rails - Ruby on Rails : dependent object destroyed when transfered from guest user to registered user

标签 ruby-on-rails ruby ruby-on-rails-4 devise

这是我的问题:

我正在使用Devise's guest_user ,其中包含一个logging_in方法,用于在注册用户登录时将guest_user参数传输给他。所以在我的例子中,用户has_many periods, dependent: :destroy ,所以这是logging_in方法:

def logging_in
  guest_periods = guest_user.periods.all
  guest_periods.each do |p|
    p.user_id = current_user.id
    p.save!
  end

  current_user.latest_entry = guest_user.latest_entry
  current_user.is_in_zone = guest_user.is_in_zone
  current_user.save
end

但是,当 guest_user 登录时,他的句号会被销毁而不是被转移。这是日志:

Started GET "/" for ::1 at 2015-05-11 00:18:03 +0300
Processing by WelcomeController#index as HTML
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 24]]
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 23]]
  Period Load (0.3ms)  SELECT "periods".* FROM "periods" WHERE "periods"."user_id" = $1  [["user_id", 23]]
   (0.2ms)  BEGIN
  CACHE (0.0ms)  SELECT "periods".* FROM "periods" WHERE "periods"."user_id" = $1  [["user_id", 23]]
  SQL (0.8ms)  UPDATE "periods" SET "user_id" = $1, "updated_at" = $2 WHERE "periods"."id" = $3  [["user_id", 24], ["updated_at", "2015-05-10 21:18:03.863162"], ["id", 170]]
   (0.9ms)  COMMIT
   (0.2ms)  BEGIN
  SQL (2.1ms)  UPDATE "users" SET "is_in_zone" = $1, "latest_entry" = $2, "updated_at" = $3 WHERE "users"."id" = $4  [["is_in_zone", "t"], ["latest_entry", "2015-05-04"], ["updated_at", "2015-05-10 21:18:03.875572"], ["id", 24]]
   (15.8ms)  COMMIT
   (0.5ms)  BEGIN
  SQL (0.3ms)  DELETE FROM "periods" WHERE "periods"."id" = $1  [["id", 170]]
  SQL (0.7ms)  DELETE FROM "users" WHERE "users"."id" = $1  [["id", 23]]
   (1.2ms)  COMMIT

所以我们可以看到传输已经完成,但最终,周期还是被销毁了。它们不应该被销毁,因为它们不再属于用户,无法被销毁。

为什么会发生这种情况?

最佳答案

即使 Period#user_id 已更改,guest_user.periods 仍会加载到内存中,并且在销毁 guest 用户时会被销毁。如果您guest_user.reload,它的关联将被清除,并且可以安全地销毁。您还可以guest_user.periods(true)强制重新加载句点。

另一个选项是:

guest_user.periods.update_all(user_id: current_user.id)

这会执行单个查询来执行更新,如果有很多周期,这会很好,并且也不会加载 guest_user.periods 关联,因此它将在销毁并找到正确的空集。

关于ruby-on-rails - Ruby on Rails : dependent object destroyed when transfered from guest user to registered user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30487033/

相关文章:

ruby - Windows 上的 Heroku 给出错误 : Contents Invalid public key

ruby-on-rails - 使用 FbGraph API 进行私有(private)消息传递

css - 从 Rails 中的 scss 文件复制 css

ruby-on-rails - Rails 交易 : does it matter on which ActiveRecord model class?

ruby-on-rails - Rails 引擎,调用容器应用的原生迁移生成器

ruby - 如何在 Ruby 字符串中每 5 个字符插入标记?

css - 找不到或无法读取要导入的 Sass 文件,文件确实存在

ruby-on-rails - 如何在 Rails 4 中使用路由进出命名空间的 Controller

ruby-on-rails-4 - 如何在 rails 应用程序中添加计时器?

ruby-on-rails - 错误 : Syntax - Html to RoR