【问题标题】:Uniqueness validation with a has_many relationship具有 has_many 关系的唯一性验证
【发布时间】:2013-05-17 07:42:13
【问题描述】:

我的模型结构如下:

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 有一个名为“名称”的属性,该属性对于每个客户端都必须是唯一的。 我尝试使用 "validates_uniqueness_of :name, :scope => [:chart_id]" 但这有助于我获得特定图表的唯一键,但不适用于特定客户的所有图表。我正在寻找类似 "validates_uniqueness_of :name, :scope => [:client_id]" 的东西,但显然对于当前的结构,它不会成功。

有人可以帮我吗?

【问题讨论】:

  • 您希望属于特定客户端的所有 chart_data 都使用相同的密钥?
  • 我希望每个客户都有唯一的 chart_data。
  • 但它没有直接关联...
  • 这是业务需求。所以虽然没有直接关系,但我希望有这个唯一性约束。

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


【解决方案1】:

由于您需要为每个客户端的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多