8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

paranoiaで論理削除済みのリレーションも取得したい

Posted at

やりたいこと

論理削除されたリレーションのカラムも使いたい。

gemのparanoia使って論理削除したレコードは↓みたいにすれば取れるらしいけど、
子レコードから親のカラムの値を取りたいけと親レコードが論理削除されている時って、どうすればいいんだ

Account.with_deleted

↓こうなってしまうんだ。

# 削除済みのアカウントのログを取る
irb(main):001:0> log = Logs.where(account_id: params[:account_id]).first
# ログは取れるけど、アカウントは削除されているので取れない
irb(main):002:0> log.account.name
  Account Load (0.9ms)  SELECT  "accounts".* FROM "accounts" WHERE "accounts"."deleted_at" IS NULL AND "accounts"."deleted_at" IS NULL
 AND "accounts"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
Traceback (most recent call last):
        1: from (irb):2
NoMethodError (undefined method `name' for nil:NilClass)

バージョン

  • Ruby
$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
  • Rails
$ rails -v
Rails 5.2.3
  • paranoia
Gemfile.lock
paranoia (2.4.2)

Relation

Accountがあって、Accountが何か操作をするたびにLogを保存している。

class Account < ApplicationRecord
    has_many :logs

    acts_as_paranoid
end
class Log < ApplicationRecord
    belongs_to :account
end

よく見たら本家に書いてあったわ

GitHub
https://github.com/rubysherpas/paranoia

結論

こんな感じにすれば取れるようになった。

class Log < ApplicationRecord
    belongs_to :account, -> { with_deleted }
end
irb(main):001:0> log = Logs.where(account_id: params[:account_id]).first
irb(main):002:0> log.account.name
  Account Load (0.6ms)  SELECT  "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
=> "管理者ユーザ"

Logクラス側で、親のaccountは削除したものも取ってきてねって設定すれば良かったのね。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?