ActiveRecord 在创建新实例时不设置共享模型的 ID

问题描述 投票:0回答:1

不完全确定如何谷歌这个确切的问题,但要点是我有几个模型 - 用户属于一个帐户,评估属于一个帐户,用户和评估在其表中都有 account_id 。在同一帐户中初始化另一个模型的任何模型都应具有相同的帐户 ID。这是为了确保应用程序中多租户基于行的数据隔离。

这就是我的模型的大致样子。事实上,还有许多其他模型

belongs_to
帐户,我想确保所有数据都与正确的帐户相关联。

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 应该为我管理这个问题是错误的吗?是否有一种替代方法可以帮助确保如果一个模型创建另一个模型并且两个模型都有

account_id
字段,则将使用相同的值创建新实例?

我能看到的唯一替代方案是在每次创建对象时手动设置帐户 ID。

ruby-on-rails ruby multi-tenant
1个回答
0
投票

create
方法无法了解有关
user
对象的任何信息。您必须将
account: user.account
传递到方法中才能创建“反向关联”。

© www.soinside.com 2019 - 2024. All rights reserved.