Rails 6.1子类重写belongs_to关联无效?创建实例时报错
Rails 6.1 子类重写belongs_to关联仍触发非空验证的问题
你遇到的问题并非Rails不支持重写关联,而是Rails 5+中belongs_to默认会自动添加validates_presence_of验证,子类继承父类时会继承该验证规则。即使子类重写belongs_to :user, optional: true,父类已添加的非空验证依然会生效,导致创建ExtraPost实例时触发“user不能为空”的错误。
解决方案
方案一:在子类中移除父类的非空验证
直接在子类里删除继承自父类的user字段存在性验证:
class ExtraPost < Post belongs_to :user, optional: true # 移除父类继承的user非空验证 _validators[:user].delete_if { |validator| validator.is_a?(ActiveRecord::Validations::PresenceValidator) } end
方案二:调整父类逻辑,通过条件验证控制必填性
修改父类的关联与验证规则,让子类可以通过重写方法来取消验证,这种方式更具扩展性:
class Post < ActiveRecord::Base # 父类先设置关联为可选,再通过条件验证控制必填 belongs_to :user, optional: true validates_presence_of :user, unless: :allow_blank_user? # 默认不允许user为空 def allow_blank_user? false end end class ExtraPost < Post # 子类重写方法,允许user为空 def allow_blank_user? true end end
内容的提问来源于stack exchange,提问作者baim
相关产品推荐
相关产品推荐

