Ruby on rails 验证属于关联的唯一性

Ruby on rails 验证属于关联的唯一性,ruby-on-rails,Ruby On Rails,我有以下型号: class ServiceType has_many :plans end class Plan belongs_to :service_type has_many :agreements end class Agreement belongs_to :plan validates :external_reference, :uniqueness => {:scope => Plan.service_type_id} << this

我有以下型号:

class ServiceType
  has_many :plans
end

class Plan
  belongs_to :service_type
  has_many :agreements
end

class Agreement
  belongs_to :plan
  validates :external_reference, :uniqueness => {:scope => Plan.service_type_id} << this is wrong!
end

谢谢您的建议。

请尝试以下网址:

在rails2中

 validates_uniqueness_of :external_reference, :scope => :your_scope
在铁路3

 validates :external_reference, :uniqueness => {:scope => :your_scope}

您可以使用自定义验证。 比方说,验证服务类型上的外部引用的唯一性

您必须按照以下步骤操作:

class ServiceType
  has_many :plans
  has_many :agreements, through: :plan
end

class Agreement
  belongs_to :plan
  validate :validates_uniqueness_of_external_reference_on_service_type

  def validates_uniqueness_of_external_reference_on_service_type
    errors.add(:external_reference, 'has already been taken on current service type') if plan.service_type.agreements.exists?(external_reference: external_reference)
  end
end

谢谢-这是我一直坚持的:your_scope部分。这是你想要确定其范围的文件名。就像你想在两个属性上添加唯一性验证一样,这意味着如果“external_reference”和“your_scope另一个_字段”是唯一的,那么你的模型是有效的。我很新,你说的听起来很完美,我只是不知道如何编写代码:您只想验证单字段外部引用。我认为您无法在协议中的ServiceType上实现作用域,因为它们没有连接。这就像A->B->C,但您需要C->A。即使它们通过B连接,也不可能?
class ServiceType
  has_many :plans
  has_many :agreements, through: :plan
end

class Agreement
  belongs_to :plan
  validate :validates_uniqueness_of_external_reference_on_service_type

  def validates_uniqueness_of_external_reference_on_service_type
    errors.add(:external_reference, 'has already been taken on current service type') if plan.service_type.agreements.exists?(external_reference: external_reference)
  end
end