2014-09-30 67 views
0

我有一個PostgreSQL表Grails領域約束映射到PostgreSQL吉斯特約束

CREATE TABLE reservation_table (
    idreservation   SERIAL NOT NULL, 
    entry_datetime  TIMESTAMPTZ NOT NULL DEFAULT 'NOW', 
    start_end_dates  DATERANGE NOT NULL , 
    property_id   INT NOT NULL REFERENCES property_table, 
... 
) 

和約束,以防止2只保留了相同的屬性上同日

ALTER TABLE ONLY reservation_table 
    ADD CONSTRAINT reservation_double_booking_constraint 
    EXCLUDE USING gist 
    (property_id WITH =, start_end_dates WITH &&) 
; 

我能執行我的SQL約束在我的Grails Reservation域中?

我正在考慮使用視圖,以避免在常規

create view resView as 
     select idReservation, 
      lower(start_end_dates) AS startDate, 
      upper(start_end_dates) AS endDate, 
      property_id 
     from reservation_table 
+0

你的意思是你想要將視圖映射到你的域而不是表? – danielad 2014-10-04 11:30:24

+0

我想要一個簡單,易於維護的域。範圍類型尚未得到完全支持 - 因此,使用具有開始日期和結束日期的視圖簡化了我的Grails代碼,同時允許我的數據庫約束來防止通過另一個應用程序輸入的雙重預訂公寓。這是我的第一個Web應用程序,所以我仍然在學習hibernate/grails約束是否可以執行。我希望有人能夠指向我在grails/hibernate中的GIST樣式約束機制 - 但我還沒有找到。 – 2014-10-05 11:38:35

回答

0

好PostgreSQL的範圍問題訪問預約,但你指定的最起碼的信息來解決這樣的問題,因爲我還沒有完全理解它,我有以下建議。

如何在grails上使用攔截器之前和之後。

class Reservation { 

    Date startDate ... 

    def beforeInterceptor = { 

    //do some date validation here start data or end date 
    //for exmaple you might check that we have 
    //any start date currently existing on db 
    //by findbyStartDate or endDate 
    //then reject the reservation or saving of this model 
     println "validation error here , cancel save" 
    } 
    static constraints = { 
     //do some validation here related to ur constraint 
     startDate max: new Date() 
    } 
    } 

讓我知道任何事情,如果你需要更多的幫助。 。 。

+0

Postgresql daterange包含開始日期和結束日期。 postgresql約束可防止範圍與現有預留(對於相同屬性)重疊的預留插入。我正在尋找一個常規約束 - 而不是異步代碼。 – 2014-09-30 10:07:40

+0

https://github.com/kaleidos/grails-postgresql-extensions postgresql範圍仍在開發中。我將根據標準的開始和結束日期來實現一個簡單的預留域。域約束重複數據庫約束,違反幹(不要重複自己) – 2014-10-01 12:17:11

+0

老兄很高興它爲你工作! – danielad 2014-10-06 14:00:53