ActiveRecord数组列更新后无法保存问题求助
解决Postgres数组列合并后无法保存的问题
看起来你在Rails里操作Postgres数组类型列时遇到了保存不生效的问题,我来帮你排查解决!
首先看你的irb步骤,我注意到第003行只是计算出了合并后的数组["Foo", "Bar"],但没有把这个结果赋值回original.aliases属性——这很可能是保存失败的第一个原因!
第一步:确认完成赋值操作
你需要把合并后的数组明确赋值给原对象的属性,再执行保存:
# 先合并并赋值 original.aliases = original.aliases | duplicate.aliases # 再执行保存 original.save!
如果已经做了赋值,但保存还是没生效,那大概率是Rails的脏检测机制没触发。因为数组是引用类型,当你直接修改数组内容(或者像上面那样用|返回新数组,但有时候Rails还是可能没检测到变化),Rails可能认为属性没有被修改,所以不会执行更新语句。
第二步:手动触发脏检测
遇到这种情况,你可以手动告诉Rails数组属性已经发生变化,再执行保存:
original.aliases = original.aliases | duplicate.aliases # 手动触发脏检测,通知Rails属性已变更 original.aliases_will_change! original.save!
更稳妥的方案:直接用Postgres数组函数更新
如果上面的方法还是有问题,推荐直接在数据库层面完成数组合并,绕开Rails的脏检测。Postgres本身提供了丰富的数组操作函数,比如用UNION实现去重合并:
# 直接在数据库层面执行更新,确保操作生效 Thing.where(id: original.id).update_all( "aliases = (SELECT ARRAY(SELECT unnest(aliases) UNION SELECT unnest(ARRAY[?]::varchar[])))", duplicate.aliases )
这个语句会把原数组和重复对象的数组去重后合并,直接更新数据库,完全不会有Rails层面的检测问题。
内容的提问来源于stack exchange,提问作者amoks
相关产品推荐
相关产品推荐

