Rails如何通过关联表id获取另一表字段并计算账户余额
问题根因
你访问的交易列表页对应路由指向TransactionsController#index,@accounts变量仅在AccountsController#index中定义,未在TransactionsController的index方法中声明,因此视图读取时会报未定义或空值错误。
修复步骤
1. 确认模型关联配置
先确保两个模型的关联代码正确:
app/models/transaction.rb新增关联声明:
belongs_to :account
app/models/account.rb新增关联声明:
has_many :transactions
2. 修改TransactionsController代码
在app/controllers/transactions_controller.rb的index方法中补充需要的实例变量,同时加入预加载避免N+1查询问题:
class TransactionsController < ApplicationController def index # 加载所有交易,同时预加载关联的账户数据 @transactions = Transaction.includes(:account).all # 如果页面需要遍历所有账户做统计,补充这行定义@accounts @accounts = Account.all end end
3. 视图层代码调整
交易列表页app/views/transactions/index.html.erb可以直接通过关联读取账户字段,无需手动匹配account_id:
- 展示单条交易对应的账户名称:
<% @transactions.each do |transaction| %> <div> 交易标题:<%= transaction.title %> 交易金额:<%= transaction.value %> 所属账户:<%= transaction.account.title %> </div> <% end %>
- 统计每个账户的总余额:
<% @accounts.each do |account| %> <div> 账户名称:<%= account.title %> 账户总余额:<%= account.transactions.sum(:value) %> </div> <% end %>
可选优化
你的表结构中accounts已经内置了balance字段,可以在交易数据新增、修改、删除时同步更新该字段,避免页面渲染时实时求和,大幅提升大用户量下的访问性能。
内容的提问来源于stack exchange,提问作者Ayoub Ben Thabet
相关产品推荐
相关产品推荐

