在我的Rails应用中,我的课程相互依赖,ParkingSpace
和Parking Lot
。
ParkingLot
有多个ParkingSpaces
,ParkingSpace
属于ParkingLot
。
我想确保无法再将相同的ParkingSpace
插入ParkingLot
。
通常,我会使用唯一性验证来确保ParkingSpace不能重复停车位有非常通用的名称
id为1的 ParkingLot
可以有ParkingSpaces
1,2和3。
ParkingLot
也可以包含ParkingSpaces
1,2和3。
但上述停车场不应该有两个同名停车位。
如何在Rails中验证这一点? 如何在数据库级别验证?
我正在考虑以一种独特的方式将两个领域连接在一起,然后在那上面调用唯一的。这是一种有效的方法吗? (不完全确定如何在数据库级别执行此操作,但我的所有验证都需要存在。)
(使用Postgres)
答案 0 :(得分:2)
假设您的停车位和标识符(如名称),您可以在ParkingSpace类中执行以下操作:
class ParkingSpace < ActiveRecord::Base
belongs_to :parking_lot
validates_uniqueness_of :name, :scope => :parking_lot_id
end
答案 1 :(得分:0)
您正在创建一个具有唯一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
请务必注意,不应混用多列约束 与常规的一行。这可能会导致意外行为。