Rails 5中更新关联ActiveRecord的哈希状态值问题
解决方法:修正代码逻辑,正确修改还款状态
首先,我帮你梳理下原代码里的几个问题,然后给出能达到需求的修正版本:
原代码的核心问题
- 语法与判断逻辑错误:
current_savings != nil?是错误的写法,正确的非空判断应该是!current_savings.nil?或者更Ruby化的current_savings.present?。另外,current_savings是一个哈希数组(从你在rails c里用select方法能看出来),不能直接调用.status,得先筛选出状态为repaid的记录。 - 修改值的方式错误:
mambu_repayments.last = 'COMPLETE'是把数组的最后一个元素直接替换成了字符串,而你需要的是修改该哈希元素里的"state"键值,应该用哈希的键赋值方式。 - 未处理所有符合条件的储蓄记录:原代码只执行了一次判断,没有遍历所有状态为
repaid的储蓄记录,无法覆盖所有需要修改的场景。
修正后的代码
# 先筛选出所有状态为'repaid'的储蓄记录 repaid_savings = current_savings.select { |saving| saving[:status] == 'repaid' } # 遍历每个符合条件的储蓄记录,处理对应的还款 repaid_savings.each do |saving| # 获取该储蓄下所有状态为'PAID'的还款记录 paid_repayments = saving.get_repayments_with_parents.select { |rp| rp["state"] == 'PAID' } # 如果存在这样的还款记录,修改最后一笔的state为'COMPLETE' if paid_repayments.present? paid_repayments.last["state"] = 'COMPLETE' # 重要提醒:如果这些还款记录是ActiveRecord对象(需要持久化到数据库),请加上保存操作 # 比如:paid_repayments.last.save! 或者 paid_repayments.last.update(state: 'COMPLETE') end end
额外说明
- 如果你只是在内存中修改哈希值,那上面的代码就足够;但如果这些还款记录是数据库中的模型实例,一定要调用
save或update方法才能把修改同步到数据库。 - 用
present?替代nil?或empty?是Ruby/Rails里的最佳实践,它能同时判断对象是否为nil以及是否为空集合。
内容的提问来源于stack exchange,提问作者Dr.Gonzo
相关产品推荐
相关产品推荐

