验证彼此依赖的字段

时间:2013-01-09 21:21:35

标签: sql ruby-on-rails postgresql

在我的Rails应用中,我的课程相互依赖,ParkingSpaceParking Lot

ParkingLot有多个ParkingSpacesParkingSpace属于ParkingLot

我想确保无法再将相同的ParkingSpace插入ParkingLot

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

id为1的

ParkingLot可以有ParkingSpaces 1,2和3。

id为2的

ParkingLot也可以包含ParkingSpaces 1,2和3。

但上述停车场不应该有两个同名停车位。

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

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

(使用Postgres)

3 个答案:

答案 0 :(得分:2)

假设您的停车位和标识符(如名称),您可以在ParkingSpace类中执行以下操作:

class ParkingSpace < ActiveRecord::Base

  belongs_to :parking_lot

  validates_uniqueness_of :name, :scope => :parking_lot_id

end

答案 1 :(得分:0)

很好,因为停车#属于停车场。你会在停车场模型中添加一个单一性验证来验证unqiuness:parkingspace_id

您正在创建一个具有唯一ID的停车位对象,因此停车位#1将为id = 1.如果您验证了id的单一性,那么您将确保另一个停车场可以添加它。

答案 2 :(得分:0)

看起来像这样的宝石:“性感的PG限制更接近答案。”\

https://github.com/maxim/sexy_pg_constraints

随意添加或解释任何内容。

来自文档

  

多栏约束

     

假设您现在只想告诉您的同一桌“书籍”   Postgres确保你永远不会有相同的标题+   author_id组合。这意味着您想要应用唯一性   两列,而不仅仅是一列。有一种特殊的语法可供使用   多列约束。

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
  

请务必注意,不应混用多列约束   与常规的一行。这可能会导致意外行为。