铁路模型:对相关实体的属性使用validates_uniqueness_of和范围?

时间:2011-03-21 12:25:51

标签: ruby-on-rails model scope has-and-belongs-to-many validates-uniqueness-of

我的模型定义如下

    class One <Active:Record:Base
    {
         has_and_belongs_to_many :twos, {:join_table => 'map__ones__twos'}
    }

    class Two <Active:Record:Base
    {
         has_and_belongs_to_many :ones, {:join_table => 'map__ones__twos'}
    }

我希望两个名称属性对于一个范围应该是唯一的。这意味着属于一个的两个人应该有唯一的名字。在这里,我无法在两个模型

中指定下面的内容
      validates_uniqueness_of :name, :scope => one_id

因为on_id不是两个表的列。而是通过表map_ 一些 _twos(多对多关系)将one_id和two_id相互映射

请建议

1 个答案:

答案 0 :(得分:1)

我经常发现使用has_and_belongs_to_many比使用它更麻烦。当我有多对多的关系时,我会创建一个连接表并为它创建一个模型。然后,连接模型可以验证两个id的唯一性。

请原谅这些名字。我正在使用您问题中的示例表名称。在您的情况下,这看起来像:

class MapOnesTwo < ActiveRecord::Base
  belongs_to :one
  belongs_to :two

  validates_presence_of :one_id, :two_id
  validates_uniqueness_of :one_id, :scope => :two_id
end

您的One模型如下所示:

class One < ActiveRecord::Base
  has_many :ones_twos, :dependent => :destroy
  has_many :twos, :through => :ones_twos
end

你的两个模型看起来像这样:

class Two < ActiveRecord::Base
  has_many :ones_twos, :dependent => :destroy
  has_many :twos, :through => :ones_twos
end