ruby-on-rails - 多个对象 Rails 上的相关验证

标签 ruby-on-rails ruby validation activerecord

我有三个 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/

相关文章:

ruby-on-rails - RoR ActiveRecord::Base uniq 在尝试 uniq.pluck(:column_name) 时未定义

ruby - 如何将自定义日志级别添加到 ruby​​ 中的记录器?

ruby - 由 Linux 运行并由 Chef 配置的虚拟机上的执行/读取问题

asp.net-mvc - ASP.net mvc 不验证子模型

ruby-on-rails - 如何使用 Ruby 测试变量是否包含在整数列表中?

ruby-on-rails - 在 ROR 中为 JSON 处理函数添加 XML 支持

ruby-on-rails - 将时间与时间范围进行比较,并在之前、期间或之后返回

ruby-on-rails - 通过连接表无法工作的多对多关系的 Rails ActiveAdmin 表单

ruby-on-rails - 动态模型验证

json - `additionalProperties` JSON 架构中的规则未应用于嵌套级别属性