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 をメソッドに渡す必要があります。