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'}
    }

2 つの名前属性は、1 つのスコープに対して一意である必要があります。つまり、1 つに属するすべての 2 つには固有の名前が必要です。ここでは、Twoモデルで以下のようなものを指定できません

      validates_uniqueness_of :name, :scope => one_id

on_id は 2 の表の列ではないためです。むしろ、one_id と two_id は、テーブルmap_ones_twos (多対多の関係) を介して互いにマップされます。

提案してください

4

1 に答える 1

1

has_and_belongs_to_many を使用することは、価値があるよりも面倒であることがよくあります。多対多の関係がある場合は、結合テーブルを作成してそのモデルを作成します。次に、結合モデルで 2 つの 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

Two モデルは次のようになります。

class Two < ActiveRecord::Base
  has_many :ones_twos, :dependent => :destroy
  has_many :twos, :through => :ones_twos
end
于 2011-03-24T15:19:27.430 に答える