0

私のRailsアプリには、相互に依存するクラスがParkingSpaceありParking Lotます。

AParkingLotには多くがParkingSpacesあり、にParkingSpace属しParkingLotます。

ParkingSpace同じものを二度と挿入できないようにしたいと思いParkingLotます。

通常、私は一意性の検証を使用して、ParkingSpaceが繰り返されないことを確認します。ParkingSpaceには非常に一般的な名前が付いています

ParkingLotid:1の場合ParkingSpaces、1、2、および3を含めることができます。

ParkingLotParkingSpacesid:2を使用すると、1、2、および3を含めることもできます。

ただし、上記の駐車場は、同じ名前の駐車スペースを2つ持つことはできません。

Railsでこれを検証するにはどうすればよいですか?これをデータベースレベルで検証するにはどうすればよいですか?

私は、2つのフィールドを独自の方法で結合し、それを独自に呼び出すことを検討しています。これは有効なアプローチですか?(データベースレベルでこれを行う方法は正確にはわかりませんが、すべての検証がそこに存在する必要があります。)

(Postgresを使用)

4

3 に答える 3

2

駐車スペースと識別子 (名前など) があると仮定すると、ParkingSpace クラスで次のようなことを行います。

class ParkingSpace < ActiveRecord::Base

  belongs_to :parking_lot

  validates_uniqueness_of :name, :scope => :parking_lot_id

end
于 2013-01-09T21:53:05.543 に答える
0

駐車場 # は駐車場に属しているため。:parkingspace_id の一意性を検証する一意性検証を駐車場モデルに追加します。

一意の ID を持つ駐車場オブジェクトを作成しているため、駐車スペース #1 は id = 1 になります。ID の一意性を検証すると、別の駐車場がそれを追加できるようになります。

于 2013-01-09T21:29:19.183 に答える
0

この宝石のように思えます:「セクシーな PG 制約が答えに近づいています。」\

https://github.com/maxim/sexy_pg_constraints

それに追加したり、そこから何かを説明したりしてください。

ドキュメントから

複数列の制約

同じテーブル「books」があるとします。Postgres に、同じタイトルと author_id の組み合わせを絶対に持たないように伝えたいとします。これは、一意性を 1 つの列だけでなく 2 つの列に適用することを意味します。複数列の制約を操作するための特別な構文があります。

class AddConstraintsToBooks < ActiveRecord::Migration
  def self.up
    constrain :books do |t|
      t[:title, :author_id].all :unique => true # Notice how multiple columns are listed in brackets.
    end
  end

  def self.down
    deconstrain :books do |t|
      t[:title, :author_id].all :unique
    end
  end
end

複数列の制約と通常の制約を 1 行に混在させないでください。これにより、予期しない動作が発生する可能性があります。

于 2013-01-09T22:09:40.693 に答える