假设我有两张桌子 - 产品和订单。为简单起见,假设一次只能购买一个产品,因此没有像order_items这样的连接表。所以关系是产品有很多订单,订单属于产品。因此,product_id是Order表中的fk。
产品表是STI - 子类是A,B,C。
当用户订购子类产品C时,必须在订单模型字段order_details和order_status上检查两个特殊验证。对于所有其他Product子类(即A和B),这两个字段可以为nil。换句话说,当用户购买A和B时,不需要为这两个字段运行验证。
我的问题是:
如何在Order模型中编写验证(可能是自定义?),以便订单模型知道只运行ITS两个字段的验证 - order_details和order_status - 当fk_id到Product子类C被保存到订单表?
答案 0 :(得分:4)
关键是在validate
模型中添加Order
方法以检查具体细节:
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
模型。