0

在我的 Rails 应用程序中,我有相互依赖的类,ParkingSpace并且Parking Lot.

AParkingLot有很多ParkingSpaces并且ParkingSpace属于 a ParkingLot

我想确保ParkingSpace不能ParkingLot再次插入相同的内容。

通常,我会使用唯一性验证来确保 ParkingSpace 不能重复停车位具有非常通用的名称

ParkingLotid:1 上可以有ParkingSpaces1、2 和 3。

ParkingLotid:2 上也可以有ParkingSpaces1、2 和 3。

但是上面的停车场应该不能有两个同名的车位。

如何在 Rails 中验证这一点?如何在数据库级别验证这一点?

我正在考虑以一种独特的方式将这两个领域结合在一起,然后称之为独特。这是一种有效的方法吗?(不完全确定如何在数据库级别执行此操作,但我的所有验证都需要存在。)

(使用 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

Feel free to add to it, or explain anything from it.

From the documentation

Multi-column constraints

Say you have the same table “books” only now you want to tell your Postgres to make sure that you should never have the same title + author_id combination. It means that you want to apply uniqueness to two columns, not just one. There is a special syntax for working with multicolumn constraints.

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

It’s important to note that you shouldn’t mix multicolumn constraints with regular ones in one line. This may cause unexpected behavior.

于 2013-01-09T22:09:40.693 回答