Rails ActiveRecord:Payment模型关联payee还是User的疑问
ActiveRecord 关联配置实际逻辑说明
这组配置是自定义语义别名的双向一对多关联,不存在Payment“二选一关联对象”的情况,所有关联的另一端本质都是User模型,payee只是业务层面的语义命名。
各配置项的实际作用
- Payment 模型的关联定义:
belongs_to :payee, class_name: "User" - 作用:给Payment模型生成名为
payee的关联访问方法 - 因为手动指定了
class_name: "User",Rails不会去找名为Payee的独立模型,而是直接关联到已有的User模型 - 按照Rails默认外键推导规则,Payment表需要存储
payee_id字段,用来记录关联的User主键id - User 模型的反向关联定义:
has_many :received_payments, foreign_key: 'payee_id', class_name: 'Payment'- 作用:给User模型生成名为
received_payments的关联访问方法 - 手动指定查询Payment记录时,用当前User的主键匹配Payment表的
payee_id字段 - 明确关联的模型为Payment,不会去找名为
ReceivedPayment的独立模型
- 作用:给User模型生成名为
关联配置生效后可直接调用的方法
- 在Payment实例上:
- 调用
@payment.payee即可获取该付款记录对应的收款人User实例 - 可直接读写存储在Payment表中的
payee_id外键值 - 在User实例上:
- 调用
@user.received_payments即可获取所有以该用户为收款人的Payment记录集合 - 支持关联链式操作,比如
@user.received_payments.create(amount: 50)可直接创建一条收款人对应当前用户的Payment记录
- 调用
常见认知误区:
payee只是业务语义上的命名别名,并不是独立的关联模型,整个关联的两端永远是Payment和User。
内容的提问来源于stack exchange,提问作者Abu bakkar siddique
相关产品推荐
相关产品推荐

