我有一个ClothRecord
模型。此模型属于OrderItem
模型。并且也属于Cloth
模型。此Cloth
模型具有kind
列。
在这种情况下,会创建新的ClothRecord
记录。这个记录有一块布,那种柱是“贝壳”。另一个ClothRecord
被创建。这条记录也有布料。但是这条记录不应该有kind
列。但是如果这个记录属于另一个OrderItem,那就没关系了。所以我认为下面的代码有效,但没有。
class ClothRecord < ApplicationRecord
belongs_to :cloth
belongs_to :order_item
validates_uniqueness_of :cloth_kind, scope: :order_item_id
def cloth_kind
cloth.kind
end
end
我应该编写自定义验证方法吗?如果我应该如何编码这个复杂的验证?
答案 0 :(得分:0)
我认为你想要的是奇怪的,但你可以使用自定义验证方法来做这样的事情(未经测试)
class ClothRecord < ApplicationRecord
belongs_to :cloth
belongs_to :order_item
validate :record_uniqueness
def cloth_kind
cloth.kind
end
def record_uniqueness
similar = ClothRecord.joins(:cloth)
.exists?('clothes.kind = ? AND order_items.id = ?', cloth_kind, order_item)
errors.add(:cloth, "must be unique to order item") if similar
# You can add the error to :order_item_id too
end
end
我认为,如果您能确保ClothRecord
+ Cloth
+ OrderItem
的唯一性,那就更容易了
validates_uniqueness_of :cloth, scope: :order_item_id
您还可以查看:conditions
的{{1}}参数,您可以在其中指定validates_uniqueness_of
的其他查询片段。