Rails5升级:如何修复exists?传入ActiveRecord实例的弃用警告
问题根因
该弃用警告是Rails5版本对exists?方法的入参校验新增的限制:Rails4及更早版本允许直接向exists?传入ActiveRecord实例对象,Rails5开始要求仅传入主键值,传入实例就会触发对应警告。
需要修改的代码位置(按出现概率从高到低排序)
1. Assignment模型内的Contact相关自定义校验
90%以上的该场景问题出现在自定义存在性校验逻辑中错误传入了contact实例:
- 错误写法示例:
validate :contact_available def contact_available # 此处直接传入contact实例触发警告 return if Contact.exists?(contact) errors.add(:contact, "联系人不存在") end
- 修改方案(二选一即可,更推荐第一种):
# 方案1:直接读取外键字段contact_id查询,无需实例化关联对象性能更好 return if Contact.exists?(contact_id) # 方案2:显式调用.id方法获取实例的主键值 return if Contact.exists?(contact.id)
2. Assignment模型的关联存在性校验配置
Rails5.0的早期迭代版本对validates :contact, presence: true的底层实现存在兼容问题,会自动触发exists?(contact实例)调用,如果你配置了该校验可以调整为:
# 仅校验外键即可 validates :contact_id, presence: true
如果你的Assignment模型已经写了belongs_to :contact,Rails5开始belongs_to关联默认必填,无需额外写presence校验,直接删除该行校验即可。
3. 控制器强参数配置
检查AssignmentsController的assignment_params方法,确保你接收的参数是contact_id而非contact对象,避免赋值阶段触发关联校验逻辑传入实例:
def assignment_params params.require(:assignment).permit(:contact_id, # 其他你需要的字段) end
内容的提问来源于stack exchange,提问作者thefonso
相关产品推荐
相关产品推荐

