如何用Ruby on Rails为嵌套对象定制序列化程序

57 阅读3分钟

在为编码训练营的最后一周创建我的毕业设计时,我最初面临的最大挑战之一是,根据项目指南,创建一个有多个多对多模型关系的项目。在绞尽脑汁想办法之后,我最终确定了一个音乐会跟踪的想法,这将满足项目的要求。

这个概念在我的头脑中是有意义的,而且我知道哪些模型是使其工作所必需的。生成模型、给它们分配宏观关联、在Rails控制台测试这些关联的过程是无缝的,我对我所确定的想法非常满意。然而,直到我真正开始从我的前端向后端模型控制器发出API请求,以便在React中处理我的数据时,我才意识到我没有得到我所需要的特定键:值对对象,以使其发挥作用。我的三个主要模型之间的连接表只给我一个对象的ID,而不是对象本身的值。我知道这需要某种序列化,但就是不知道该如何去做。

基本上,我的模型由乐队、场地和日期组成,所有这些都通过Concerts的连接表相互关联。一个乐队通过音乐会拥有许多场地,一个场地通过音乐会拥有许多日期,如此等等。我的意图是创建一个音乐会跟踪应用程序,它将显示一个音乐会的列表,其中包括日期、演奏的乐队和举办该音乐会的场地等信息。我的问题是,持有所有这些相关信息的Concert对象,对于渲染我的项目的特定细节是必要的,在React中处理数据时只持有这些对象的id。

我向后端服务器获取数据以获得对Concert对象的访问时,返回的是一个承诺的形式:

{date_id: 4, venue_id: 12, band_id:7}

虽然在后端播种我的数据以表示我们在上面看到的对象来创建连接表是有意义的,但在一个完美的世界里,为了通过javascript对象点符号更容易访问,我希望我的对象看起来更像这样。

{date: "10/23/2022, venue: "CrossRoadsKC", band: "BROCKHAMPTON}

在对乐队、场地和日期模型的序列化进行玩弄之后,我的解决方案看起来有点像这样:

def all_concerts
    self.object.concerts.map do |each_concert|
      {"concert_date": each_concert.concert_date, "concert_venue": each_concert.venue, "concert_band": each_concert.band }
    end
  end

基本上我所做的就是创建一个自定义对象,允许我直接命名一个键,并为该键分配我需要的相关值。它通过获取self的实例来做到这一点,self是执行当前代码的特定对象--在我们的例子中,是一个乐队、场地或日期--并映射其嵌套的音乐会来执行一个特定的动作。在这种情况下,这个动作是为那个特定的乐队、场地或日期的每一场音乐会,并为它们分配音乐会连接表通过其 belongs_to 关联访问的键和值。

然后,当我每次向后端发出API请求时,"band_concerts "对象就会作为嵌套对象出现在我的乐队中,当我在前端处理数据时,给我提供我所需要的确切对象,并为我正在处理的每个模型提供方便的访问和相关的信息。