如何验证另一个关联键的唯一性?

时间:2017-04-28 04:37:46

标签: ruby-on-rails validation model associations

我有一个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

我应该编写自定义验证方法吗?如果我应该如何编码这个复杂的验证?

1 个答案:

答案 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的其他查询片段。