将验证上下文传递给关联模型

Mat*_*tW. 2 validation ruby-on-rails associations

我使用上下文在模型生命周期的不同点调用特定验证:

model Address
    validates :city, presence: true
    validates :street, presence: true, on: :send_letter
end

incomplete_address = Address.new(city: 'Berlin')
incomplete_address.valid? # => true
incomplete_address.valid?(:send_letter) # => false
Run Code Online (Sandbox Code Playgroud)

这对于上面的简单情况来说效果很好。但是,据我所知,任何关联对象的上下文都会被忽略:

model Address
    belongs_to :country
    validates :street, presence: true, on: :send_letter
    validates_associated :country
end

model Country
    has_many :addresses
    validates :iso_alpha_3, presence: true, size: 3, on: :send_letter
end

incomplete_address = Address.new(street: 'Oranienstr', country: Country.new(name: 'Germany', iso_alpha_3: 'Invalid iso code')

incomplete_address.valid? # => true
incomplete_address.valid?(:send_letter) # => true
incomplete_address.country.valid?(:send_letter) => false
Run Code Online (Sandbox Code Playgroud)

问题:这是预期的行为,还是我遇到的错误?或者我犯了概念错误?在这种情况下验证关联模型的最优雅的方法是什么?

pix*_*aki 5

我知道这个问题已经有 3 年历史了,但现在有一条稍微简单一点的路径,而且即将出现一个更简单的选择。

目前有一个出色的 PR通过通话中的配置选项添加了此功能validates_associated。同时,您可以将该版本添加AssociatedValidator为单独的验证器(例如AssociatedPreservingContextValidator)并调用validate_with AssociatedPreservingContextValidator, :country`Address.