Rails中如何将关联admin表的phone字段数据传递到对应的user表
实现方案
分为历史存量数据同步和新增数据逻辑修复两部分:
1. 历史存量数据同步
执行以下批量处理逻辑,把admin表已有的手机号同步到关联user表的phone字段,可直接在Rails控制台执行,也可以写成独立的迁移任务:
Admin.includes(:user).find_each do |admin| # 跳过user表已有手机号的记录,避免覆盖正常数据 next if admin.user.phone.present? # 直接更新字段跳过验证和回调,提升批量处理效率 admin.user.update_column(:phone, admin.phone) end
2. 修复新注册admin的手机号同步逻辑
有两种可选实现方式,可按需选择:
方式一:直接修改Admin控制器的create方法
创建User时把admin提交的手机号参数传入即可,修改后代码如下:
def create email = params[:admin][:email] role = Role.find_by_name('admin') # 提取admin参数中的手机号 phone = params[:admin][:phone] if email.split('@').first.include?(params[:admin][:office_kind]) username = "Ad_#{email.split('@').first}" else # 注意:原代码此处params[:cd_admin]大概率是笔误,如果业务上确实是cd_admin参数可保留,否则建议修改为params[:admin] username = "Ad_#{params[:admin][:office_kind]}_#{email.split('@').first}" end # 创建User时新增phone参数,role_ids要求传数组,此处做了兼容修复 user = User.create(email: email, password: '227127', role_ids: [role.id], username: username, phone: phone) @admin = user.build_admin(admin_params.merge(creator_id: current_user.id, registered_date: Date.today, username: username)) # 原代码缺少@admin.save逻辑,建议补充后续的保存和响应处理 if @admin.save # 原有注册成功的跳转/响应逻辑 else # 原有注册失败的错误处理逻辑 end end
方式二:Admin模型加回调保证数据一致性
如果希望从底层保证双表手机号永远一致,避免其他业务入口修改admin手机号时不同步,可以在Admin模型加保存后回调:
class Admin < ApplicationRecord belongs_to :user # admin创建/更新时自动同步手机号到关联user after_save :sync_phone_to_user private def sync_phone_to_user # 只有手机号发生变更时才执行更新,减少不必要的数据库操作 return unless saved_change_to_phone? user.update_column(:phone, self.phone) end end
内容的提问来源于stack exchange,提问作者Sanju Basnet
相关产品推荐
相关产品推荐

