1

Railsプロジェクトには2つのモデル(およびテーブル)があります。各モデルには「アドレス」フィールドがあります。

現在、各モデルのアドレスの一意性を検証するようにコードを設定しています。各テーブルには、同じデータを保存しようとする複数の接続の場合に重複を防ぐためのアドレスのインデックスがあります。

ただし、Addressフィールドが2つのテーブル間で一意であることを確認したいと思います。のように、アドレスが1つのテーブルに存在する場合、2番目のテーブルに保存できませんでした。

コードでそれを解決するのはそれほど難しいことではありませんが、データベースレベル(インデックスと同様)でそのチェックを実装して、一意でない値が保存されないようにするにはどうすればよいですか?

4

2 に答える 2

2

独自性を維持する役割を担うことができるアドレステーブルを作成するのが最善です。他のモデルでアドレスフィールドを維持するのではなく、代わりに関連付けを提供します。それは次のように行うことができます:

class Home < ActiveRecord::Base
  belongs_to :address
end

class Office < ActiveRecord::Base
  belongs_to :address
end

class Address < ActiveRecord::Base
  attr_accessible :body
  validates :body, uniqueness: true

  has_many :homes
  has_may :offices
end
于 2012-09-27T03:37:11.097 に答える
0

両方のテーブルにカスタムバリデーターを記述します。カスタム検証レールガイド は、開始するのに最適な場所です。カスタムバリデーターでは、その値が別のテーブルのアドレスフィールドにすでに存在する場合、エラーが発生する可能性があります。

于 2012-09-27T08:56:09.437 に答える