やりたいこと
論理削除されたリレーションのカラムも使いたい。
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は削除したものも取ってきてねって設定すれば良かったのね。