ActiveRecord创建关联实例时未自动设置共享模型account_id的问题
问题解答
你确实误解了Rails的自动关联逻辑——Rails不会自动将关联模型的account_id传递给新创建的关联对象,除非你显式配置相关逻辑。下面是几种无需手动设置account_id的解决方案:
方案1:在Assessment模型中添加回调自动赋值
这是最直接省心的方式,利用before_create回调,从关联的User实例中获取account_id并赋值:
class Assessment < ApplicationRecord belongs_to :user before_create :inherit_account_id_from_user private def inherit_account_id_from_user self.account_id = user.account_id if user.present? end end
不管是通过user.assessments.create还是其他关联方式创建Assessment,都会自动继承User的account_id。
方案2:在User的关联定义中配置默认属性
你也可以在User的has_many :assessments关联里,通过default选项指定创建时自动带入的属性:
class User < ApplicationRecord has_many :assessments, dependent: :destroy, default: -> { { account_id: account_id } } end
这种方式会在调用user.assessments.build或create时,自动把User的account_id作为默认值传入。
补充说明
- 你当前设置的
default_scope只影响查询逻辑(比如User.first只会返回account_id=Account.current_id的用户),完全不涉及创建时的属性赋值逻辑,所以不能依赖它自动填充account_id。 - 如果你的多租户逻辑需要更严谨的隔离,可以考虑使用成熟的多租户gem,但如果只是简单的行级隔离,上面的方案足够解决问题。
内容的提问来源于stack exchange,提问作者wubbalubba
相关产品推荐
相关产品推荐

