2014-05-20 77 views
0

如果我們有一個域對象,例如銷售交易,我們希望銷售的日期是現在。理想情況下,調用代碼甚至不應該能夠設置屬性,但這大概是不可能的。grails如何將默認值設置爲日期

如果我們考慮以下對象:

class salesTransaction{ 
    String description 
    Item item 
    Date soldAt 

static constraintes = { 
    description blank: false 
    item blank: false 
    soldAt blank: false, defaultValue: new Date() 
} 

這看起來像它應該工作,但保存()總是失敗財產soldAt不能爲空。

如果我在Java中做這個bean,我只會公開一個只接受必要參數的構造函數,可選參數的setter和soldAt的setter。我認爲沒有辦法用grails來模擬這個。

反正anyohne知道怎麼做默認參數?

最好的解決方案是在數據庫中完成它,即將數據庫中的默認值設置爲「now()」,但無法使用grails約束進行指定。

人們如何去實施這種事情?

+0

定義屬性爲'日期soldAt =新的日期()',這將讓任何實例的默認值是當前的日期和時間實例new'ed。 –

+0

你可以像你所描述的那樣創建構造函數,在這裏沒有看到任何問題。你試過了嗎? –

回答

1

如果您只是希望日期代表您最初將SalesTransaction保存到數據庫的時間,那麼您可以聲明Date dateCreated之類的屬性,並讓框架管理其值。有關更多信息,請參閱http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping

+0

不理想,因爲沒有在數據庫中設置相應的默認/約束,但解決了即時的需求,謝謝。 –

1

可以使用beforeInsert事件:

class salesTransaction{ 
    String description 
    Item item 
    Date soldAt 

static constraintes = { 
    description blank: false 
    item blank: false 
    soldAt blank: false 
} 

def beforeInsert() { 
    if (soldAt == NULL_DATE) { 
     soldAt = new Date() 
    } 
} 

} 
+1

自動時間戳會爲您做到這一點。這裏的原始問題中沒有任何內容表明這裏額外的代碼是合理的,但也許有些因素沒有被描述是重要的。如果你打算這樣做,那麼你可能想要配置soldAt爲可綁定:false,所以它不受大量數據綁定的約束。此外,您的空白:對於Date屬性爲false是不合理的。空白約束只有在String屬性的上下文中才有意義。 –

+0

要跟進空白:false在此處不適用(以前的評論中我用完了字符),請參閱https://github.com/grails/grails-core/blob/337e78161942f5a0164e7649b00e81f81f189922/grails-validation/src/main /groovy/org/codehaus/groovy/grails/validation/BlankConstraint.java#L36。 –

+0

我看到上面的例子會很有用,但不會阻止域對象的用戶將soldAt值設置爲任何他想要的值。在Java中,我不會使用setter,只是一個getter,並且在構造函數中將soldAt設置爲new Date(),並且我會使該模式中的列不爲null,默認值爲now() 。我想在Grails中沒有辦法做到這一點。 –

相關問題