多个对象Rails上的相关验证

时间:2016-02-02 00:49:34

标签: ruby-on-rails ruby validation activerecord

我有三个ActiveRecord对象需要整体验证,我还不确定如何建模或实现它。

下面列出了模型及其依赖性/验证(伪轨代码):

  • 营地
    • 属于城市
    • 属于州
    • 必须在其州内具有唯一名称
    • 有很多城市

更新露营地记录时,必须确保城市和州在尝试更新露营地记录之前有效。如果任何步骤失败,我需要确保没有任何保存。

真的很喜欢这方面的帮助!

1 个答案:

答案 0 :(得分:2)

首先,Campground无需验证其所属CityState的有效性。最有可能的是,这些将是您创建或更新露营地时不会发生变化的现有记录。

至于检查已设置的关联,使用Rails 5,任何belongs_to关联都将自动验证是否已设置关联并且该记录存在。使用Rails 4,您只需在presence内为您的关联添加Campground验证:

belongs_to :city
validates :city, presence: true

要验证州内城市名称的唯一性,您只需使用范围:

belongs_to :state
validates :name, uniqueness: {scope: :state_id}

对于其他所有内容,State确实有责任确保它在创建或更新时有效。除非其有效性的某些部分来自儿童对象的集合,否则它与?有关系?在这种情况下,您可以添加validates_associated验证。

您可以在此处查看此验证的文档:http://edgeguides.rubyonrails.org/active_record_validations.html#validates-associated

基本上,您可以在State模型中添加:

has_many :cities
validates_associated :cities

但是这只会在更新/创建父级时检查子级是否有效,而不是相反的方向。