Grails 连接数据库字段

Grails connect database fields

我正在尝试学习 Grails,但仍处于初学者水平。 我做了一个很小的应用程序,基本上你可以在其中添加事件,人们可以写关于它们的评论并给它们打分。 所以我有一个 eventController 和 reviewController。评分只是评论中的一个整数。但现在我想显示一个事件的总体评分。所以事件评分应该是相应评分值的平均值。

这是我最初设置评级的事件域代码,我省略了约束和 toString:

class Event {
Double dRating = 2

static hasMany = [ratings:Rating]

}

控制器很简单:

class EventController {

def scaffold = Event
}

评级域文件:

class Rating {
   String comment
   java.util.Date date = new java.util.Date()
   Integer rating
   Event event
}

评级控制器是:

class RatingController {
    def scaffold = Rating
}

希望我没有犯错,我不得不翻译变量名以便它们易于理解。

我猜想在 dRating 设置的地方,我可以以某种方式添加一些计算,但我什至不知道如何访问评级的值,我尝试的一切都以大量错误告终,不得不一次又一次地重新启动应用程序。我尝试在控制器中添加计算,但我不知道如何将值导入数据库。那么我实际上应该把逻辑放在哪里,我如何访问这些值?

如果其他文件重要,请告诉我。

希望得到一些关于如何开始做这件事的提示,我没想到会这么难。

首先我会建议开始阅读 grails 文档。稍后从您的问题中不太清楚您在问什么,可能有几个地方或可能在域字段中设置值并将其保存到数据库中。我说的都是我所知道的:

  1. 如果它是需要应用于您的 dRating 字段的广义计算,则创建一个具有标准 bean 命名约定的 setter 并在那里执行此操作。例如,您想从 1000 中找到百分比,然后将其添加到 dRating

    class Event {
    
     static hasMany = [ratings:Rating]
    
      Double dRating 
    
      void setDRating(Double value){
      this.dRating  = value * 100/1000 // alternatively value /10
     }
    }
    
  2. 在 commandObject 中执行:如果您不想将某些计算和验证放在域中,则将它们放在命令对象中。参见 this。您可以在任何时候通过 .properties 绑定机制将命令对象的值分配给域对象。例如,

        yourDomainObject.properties = yourcommandObjectObject.properties
    

    记住具有相同名称的属性将被绑定。

  3. Do it in service: 你可以在服务方法中做你的计算,把那个服务注入你的控制器然后调用那个方法来执行计算,甚至也坚持到数据库。请记住,服务默认是事务性的。

希望对您有所帮助!