我有三个 ActiveRecord 对象,需要作为一个整体进行验证,但我还不确定如何建模或实现它。
下面列出了模型及其依赖项/验证(伪 Rails 代码):
- 露营地
- 属于城市
- 城市
- 属于国家
- 在其所在州内必须有唯一的名称
- 状态
- 拥有许多城市
更新露营地记录时,在尝试更新露营地记录之前,必须确保城市和州均有效。如果任何步骤失败,我需要确保没有保存任何内容。
真的很想得到一些帮助!
最佳答案
首先,露营地
没有责任验证其所属的城市
或州
的有效性。这些记录很可能是现有记录,不会在您创建或更新露营地时发生变化。
至于检查关联是否已设置,Rails 5 中任何 belongs_to
关联都会自动验证关联是否已设置以及记录是否存在。使用 Rails 4,您只需在 Campground
中为您的关联添加一个存在
验证即可:
belongs_to :city
validates :city, presence: true
要验证一个州内城市名称的唯一性,您可以简单地使用范围:
belongs_to :state
validates :name, uniqueness: {scope: :state_id}
对于其他一切,State
确实有责任确保其在创建或更新时有效。除非它的有效性的某些部分来自于与其有关系的子对象的集合?在这种情况下,您可以添加 validates_linked
验证。
您可以在此处查看此验证的文档:http://edgeguides.rubyonrails.org/active_record_validations.html#validates-associated
基本上,在您的 State
模型中,您将添加:
has_many :cities
validates_associated :cities
但这只会在更新/创建父级时检查子级是否有效,而不是相反的方向。
关于ruby-on-rails - 多个对象 Rails 上的相关验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35143189/