【问题标题】:Two models, one STI and a Validation两个模型,一个 STI 和一个验证
【发布时间】:2010-04-01 14:59:26
【问题描述】:

假设我有两个表 - Products 和 Orders。为简单起见,假设一次只能购买一种产品,因此没有像 order_items 这样的连接表。所以关系是Product有很多订单,Order属于产品。因此,product_id 是 Order 表中的一个 fk。

产品表是 STI -- 子类是 A、B、C。

当用户订购子类产品 C 时,必须在订单模型字段 order_details 和 order_status 上检查两个特殊验证。对于所有其他产品子类(即 A 和 B),这两个字段可以为 nil。换句话说,当用户购买 A 和 B 时,不需要对这两个字段进行验证。

我的问题是:

我如何在 Order 模型中编写验证(可能是自定义的?),以便当 Product 子类 C 的 fk_id 保存到时,Order 模型知道只运行 ITS 两个字段的验证 - order_details 和 order_status订单表?

【问题讨论】:

  • 这里有没有使用多态的替代方法?
  • 是的...再次查看我的编辑 :) 我才明白你真正追求的是什么。对于未来的问题,最好包含实际的模型代码。从一开始就会帮助我(然后我又一次到处都是,所以可能只有我一个人:)
  • 是的,别以为是你!这是我原来的问题陈述。感谢您的帮助。

标签: ruby-on-rails single-table-inheritance validation


【解决方案1】:

关键是在Order模型中添加一个validate方法来检查细节:

  def validate
    if product and product.type_c?
      errors.add(:order_details, "can't be blank") if order_details.blank?
      # any other validations
    end
  end

或者类似的东西。只需检查 validate 中的类型并添加相应的错误。我刚刚编写了type_c? 函数。只需检查类型,但您的 Product 模型已定义。

【讨论】:

  • Tony,如果 order_details 和 order_status 字段在 Order 模型中,这仍然有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多