1

我的模型定义如下

    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 不是二进制表的列。而是 one_id 和 two_id 通过表map_ones_twos相互映射(多对多关系)

请建议

4

1 回答 1

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
于 2011-03-24T15:19:27.430 回答