Ruby on Rails 雖敏捷,但缺乏企業級服務(分散式交易、訊息佇列等)。Grails 基於 Groovy,無縫整合 Java EE 生態,同時保有腳本語言開發效率。
findAllBy*、save()、delete() 等方法。// 動態查詢:依員工查電腦
def showComputersByEmployee = {
render(view:'list', model:[
computerBeanList: ComputerBean.findAllByEmployeeBean(EmployeeBean.get(params.id))
])
}
// 關聯儲存:雙向綁定
def update = {
def computerBean = ComputerBean.get(params.id)
if (computerBean) {
if (computerBean.employeeBean) computerBean.employeeBean.computers.remove(computerBean)
computerBean.properties = params
def employeeBean = EmployeeBean.get(params.employeeId)
employeeBean.computers.add(computerBean)
computerBean.employeeBean = employeeBean
if (computerBean.save()) redirect(action:'show', id:computerBean.id)
else render(view:'edit', model:[computerBean:computerBean])
} else { flash.message = "Not found"; redirect(action:'edit', id:params.id) }
}
// 宣告式驗證規則
static constraints = {
networkId(size:6..8, blank:false, unique:true)
firstName(maxSize:20, blank:false)
lastName(maxSize:20, blank:false)
startDate(nullable:false)
}
// 進階 Criteria 查詢
def showSearchResults = {
def criteria = EmployeeBean.createCriteria()
def results = criteria {
or {
ilike("networkId", "%${params.networkId}%")
and { eq("firstName", params.firstName); eq("lastName", params.lastName) }
}
}
render(view:'list', model:[employeeBeanList: results])
}
Grails + EJB3 讓團隊同時擁有: