【问题标题】:Paranoia with belongs_to与 belongs_to 相关的偏执狂
【发布时间】:2017-04-23 18:19:40
【问题描述】:

在我的应用程序中,用户 has_many :jobs 和工作 belongs_to :user。我正在使用 paranoia gem 软删除用户和作业。

假设我有一个用户 Joe,他的工作是“推动更改”。我可以使用Job.all 在我的列表页面上查看所有工作,但一旦我删除乔斯的帐户,我就无法再使用Job.all 看到工作。

我曾尝试使用Job.with_deleted.all 并尝试取消关联belongs_to :user, -> { with_deleted } 的范围。

产生的 SQL 语句:

SELECT "jobs".* FROM "jobs" INNER JOIN "users" ON "users"."id" = "jobs"."user_id" AND "users"."deleted_at" IS NULL WHERE "jobs"."deleted_at" IS NULL ORDER BY users.name ASC

【问题讨论】:

  • 你用什么来删除? object.delete 还是 object.destroy?你应该使用destroy
  • 我是,我仍然可以使用User.with_deleted 作为用户。令人沮丧的是,"users"."deleted_at" IS NULL 被添加到我的查询中,这就是问题

标签: ruby-on-rails ruby-paranoia


【解决方案1】:

这似乎您在 has many jobs 上设置了dependent: :destroy,这是删除用户的唯一方法,将对 has_many 进行更改。你们中的一些人不希望它们被隐藏,然后只需从用户模型中删除依赖项::destroy 就拥有很多工作

【讨论】:

    【解决方案2】:

    Paranoia gem 为您的模型设置默认范围,其中不返回带时间戳的 deleted_at 属性集。 尝试取消模型的范围,例如

    User.unscoped.all

    【讨论】:

      【解决方案3】:

      我知道现在回答这个问题可能为时已晚,但根据我的经验。在 Job 模型中添加 include Mongoid::Paranoia 会将 deleted_at 添加到关联中,而不是真正删除作业记录。另外,如果要查询已删除的作业,请尝试使用Job.unscoped.all,或者如果要从作业实例中获取已删除的User,请尝试添加方法

      def user
        User.find(user_id)
      end
      

      user_id 替换为映射到用户 ID 的实际键名。

      希望对您有所帮助! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多