Techioz Blog

ActiveRecord は新しいインスタンスの作成時に共有モデルの ID を設定しません

概要

この正確な質問をどのようにGoogleで検索するか完全にはわかりませんでしたが、要点は、いくつかのモデルがあるということです - ユーザーはアカウントに属し、評価はアカウントに属し、ユーザーと評価の両方がテーブルに account_id を持っています。同じアカウント内の別のモデルを初期化するモデルはすべて、同じアカウント ID を持つ必要があります。これは、アプリケーション内でマルチテナントの行ベースのデータ分離を確保するためです。

私のモデルはおおよそ次のようになります。実際、アカウントに属するモデルは他にもたくさんあるので、すべてのデータが正しいアカウントに関連付けられていることを確認したいと考えています。

class User < ApplicationRecord
  has_many :assessments

  default_scope { where(account_id: Account.current_id)}
end

class Assessment < ApplicationRecord
  belongs_to :user
end

class Account < ApplicationRecord
  has_many :users, dependent: :destroy
  has_many :assessments
  cattr_accessor :current_id

  validates_uniqueness_of :name, presence: true
end

このコードが機能しないのはなぜですか?

user = User.first
a = user.assessment.create
a.account_id == user.account_id # a.account_id is nil so this is False
acc = Account.first
user = acc.users.first
a = user.assessment.create
a.account_id == user.account_id # a.account_id is nil so this is False

Rails がこれを管理するはずだと考えるのは間違っていますか? 1 つのモデルが別のモデルを作成し、両方のモデルに account_id フィールドがある場合に、新しいインスタンスが同じ値で作成されるようにする代替手段はありますか?

私が考えられる唯一の代替案は、オブジェクトを作成するたびにアカウント ID を手動で設定することです。

解決策

create メソッドがユーザー オブジェクトについて何かを知る方法はありません。 「後方関連付け」を作成するには、アカウント user.account をメソッドに渡す必要があります。