Rails中同一模型两列关联另一模型同一列的实现方案
在Rails中为Account模型建立双关联以获取不同类型的交易金额
嘿,这事儿好办!在Rails里,我们可以给同一个模型创建多个关联,只要给它们起不同的名字并指定对应的外键就行,完美适配你这里的需求——既要关联Transaction的account_id,又要关联bank_id。
步骤1:修改Account模型,添加双关联
打开你的app/models/account.rb,添加两个has_many关联:
class Account < ApplicationRecord # 关联所有以该账户为交易主体的记录(对应Transaction表的account_id字段) has_many :transactions, dependent: :destroy # 关联所有把该账户当作银行账户的交易记录(对应Transaction表的bank_id字段) has_many :bank_transactions, class_name: "Transaction", foreign_key: "bank_id", dependent: :destroy end
bank_transactions是我们为这个关联自定义的名字,方便区分普通交易;class_name: "Transaction"告诉Rails这个关联指向的还是Transaction模型;foreign_key: "bank_id"指定用Transaction表中的bank_id字段来关联当前Account的id。
步骤2:在视图中使用新关联获取数据
现在你想要的视图逻辑可以简化成这样,不用再手动判断id匹配:
<% Account.each do |account| %> <% if account.bank %> <%= account.account_number %> <%= account.bank_transactions.sum(:amount) %> <% end %> <% end %>
直接通过account.bank_transactions就能拿到所有把这个账户设为银行账户的交易,调用sum(:amount)就能快速算出总金额。
可选:封装方法让代码更简洁
如果这个总金额需要在多个地方使用,建议在Account模型里封装一个方法:
# app/models/account.rb def bank_transaction_total bank_transactions.sum(:amount) end
之后在视图里就可以直接写:
<%= account.bank_transaction_total %>
内容的提问来源于stack exchange,提问作者Jean Malan
相关产品推荐
相关产品推荐

