具有has_many关系的唯一性验证

时间:2013-05-17 07:42:13

标签: ruby-on-rails-3 has-many unique-constraint

我的模型结构如下:

class Client < ActiveRecord::Base
   has_many :charts
end

class Chart < ActiveRecord::Base
   belongs_to :client
   has_many :chart_data
end

class ChartDatum < ActiveRecord::Base
   belongs_to :chart
end

ChartDatum有一个名为“name”的属性,每个客户端都需要是唯一的。 我尝试使用“validates_uniqueness_of:name,:scope =&gt; [:chart_id]”,但这有助于我获取特定图表的唯一键,但不能获取特定客户的所有图表。我正在寻找像“validates_uniqueness_of:name,:scope =&gt; [:client_id]”这样的东西,但很明显,对于当前的结构,它将无法解决。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

由于您需要为每个客户端使用chart_data的唯一name,因此您可以尝试为名称编写自定义验证:

class ChartDatum < ActiveRecord::Base
  belongs_to :chart
  validates :name, :uniqueness => true, unless => :unique_for_client?

  def unique_for_client?
    client = self.chart.client
    client.charts.chart_data.pluck(:name).include?(self.name)
  end
end