2013-01-09 98 views
0

在我的Rails应用程序中,我有一些相互依赖的类,ParkingSpaceParking Lot验证相互依赖的字段

A ParkingLot有许多ParkingSpacesParkingSpace属于ParkingLot

我想确保同样的ParkingSpace不能再次插入ParkingLot

通常情况下,我会用一个唯一性验证,以确保ParkingSpace不能重复的停车位有非常通用名称

ParkingLot ID为:1有可能在上面ParkingSpaces 1,2和3。

ParkingLot id:2也可以有ParkingSpaces 1,2和3就可以了。

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

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

我正在考虑以独特的方式将两个字段连接在一起,然后调用独特的。这是一种有效的方法吗? (不完全知道如何在数据库级别做到这一点,但我所有的验证需要存在那里。)

(使用的是Postgres)

+0

如果您的rails应用程序是使用db的唯一应用程序,则不需要在db级别上进行验证。 – weltschmerz

+0

是否有两个同名的空格,或者是否有一个且只有一个名称为“1”的空格用于一堆不同的地段? –

+0

@Charles - 我的Rails应用程序将使用共享数据库。有小费吗? – ovatsug25

回答

2

假设你的停车空间和标识符(如名称),你会做喜欢的事,在ParkingSpace类:

class ParkingSpace < ActiveRecord::Base 

    belongs_to :parking_lot 

    validates_uniqueness_of :name, :scope => :parking_lot_id 

end 
+0

你知道我会在db级别做这个吗? – ovatsug25

0

以及因为停车#属于到停车场。你会添加一个独特的验证到停车场模型,验证unqiuness:parkingspace_id

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

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 

需要注意的是,你不应该在一个行多列混合约束 与普通的人是很重要的。这可能会导致意外的行为。