Rails 5 API仅从嵌套属性数组创建记录

时间:2017-01-27 15:10:11

标签: schema nested-attributes rails-api

我是Rails的新手,我想知道适当的" Rails方式"是处理以下情况。我正在处理的应用程序是一个带有ReactJS前端的Rails api-only后端。在我的模式中,我有三个以各种方式关联的模型(稍微更多):Composer,Album,Track。在客户端我创建一个看起来大致如下的对象:

{
  composer: {
    name: 'Foo',
    other_info: 'Blah Blah',
    albums: [
      {
        title: 'Album 1',
        tracks: [
          {
            title: 'Track 1',
          }, 
          {
            title: 'Track 2',
          },
        ]
      }, 
      {
        title: 'Album 2',
        tracks: [
          {
            title: 'Track 1',
          },
          {
            title: 'Track 2',
          },
        ]
      },
    ]
  }
}

关联如下:

  • 作曲家和专辑与has_many through关系相关联(作曲家可以有很多专辑,专辑可以有很多作曲家)。
  • 专辑has_many曲目,每首曲目belongs_to一张专辑。
  • 作曲家has_many跟踪并跟踪每个曲目belongs_to一位作曲家。

我很容易update编曲,专辑或跟踪记录,因为我已经拥有id,而且似乎是由Rails自动处理的。 (COOL!)

我的问题是:

有没有办法在POST请求中发送上述对象,该请求将解析相册并跟踪我可以设置正确关联的位置?

我天真的方法(我正在设置客户端......我真的不想在那里做那种业务逻辑)最终成为以下内容:

  1. 创建Composer记录和POST到Rails API。
  2. 创建Album记录和POST到Rails API。
  3. 创建所有Track条记录和POST到Rails API。
  4. 使用Composer和Album ID更新每个Track
  5. 更新要与Album相关联的Composer
  6. 我会很多而是在API中处理所有这些。 (特别是因为我需要处理Album已经存在且需要更新而不是创建的情况。)

    所以从本质上讲,我希望客户端只需要提交带有嵌套实体的对象,然后我就完成所有工作,设置新的ComposerAlbumTrack后端的记录和关联。

    这是可行的,甚至是推荐的吗?如果是这样,我真的可以使用一个很好的文档来源或关于如何处理这种情况的教程。我的搜索技巧未能产生任何似乎能解决这个问题的东西。

    谢谢!

1 个答案:

答案 0 :(得分:0)

事实证明,解决方案很简单,尽管我的架构实现起来太难了。 两者与作曲家相关的曲目专辑太麻烦了,所以我不理解这个想法。 我发现我使用:albums:tracks代替:albums_attributes:tracks_attributes。这种变化使得所有关联魔法自动发生。