验证belongs_to关联的唯一性

时间:2014-04-25 12:14:18

标签: 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 is wrong!
end

我需要强制使用作为ServiceType范围的Agreement.external_reference的唯一性。无法弄清楚要实现的语法。

EDIT 我最终解决了这个问题:

最后我做了:

class Agreement
  before_validation :set_service_type

  belongs_to :plan
  validates :external_reference, uniqueness: {scope: :service_type_id}

  private

  def set_service_type
    self.service_type_id = self.plan.service_type_id
  end

end

感谢你的所有建议。

2 个答案:

答案 0 :(得分:0)

尝试以下fromat

in rails 2

 validates_uniqueness_of :external_reference, :scope => :your_scope

in rails 3

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

答案 1 :(得分:0)

您可以使用自定义验证。 假设validates_uniqueness_of_external_reference_on_service_type

您必须执行以下操作:

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