Rails 5 API 仅从嵌套属性数组创建记录
Rails 5 API only creating records from nested attribute arrays
我是 Rails 的新手,想知道处理以下情况的正确 "Rails way" 是什么。我正在处理的应用程序是一个 Rails api-only 后端,带有 ReactJS 前端。在我的架构中,我有三个以各种方式关联的模型(稍后会详细介绍):作曲家、专辑、曲目。在客户端中,我创建了一个大致如下所示的对象:
{
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 自动处理。 (酷!)
我的问题是:
有没有办法在 POST
请求中发送上面的对象,解析出我可以设置正确关联的专辑和曲目?
我的幼稚方法(我当时正在客户端上设置...我真的不想在那里做那种业务逻辑)结果如下:
- 创建
Composer
记录并 POST
到 Rails API。
- 创建
Album
记录并 POST
到 Rails API。
- 创建所有
Track
记录和 POST
到 Rails API。
- 使用作曲家和专辑 ID 更新每个
Track
。
- 更新
Album
以关联到 Composer
。
我多宁愿在API中处理所有这些。 (特别是因为我需要处理 Album
已经存在并且需要 更新 而不是 创建 的情况。)
所以从本质上讲,我希望客户只需像上面那样提交带有嵌套实体的对象,然后我完成所有设置新 Composer
、Album
的工作, 以及后端的 Track
记录和关联。
这是可行的还是值得推荐的?如果是这样,我真的可以使用一个很好的文档来源或一个关于如何处理这种情况的教程。我的搜索技巧未能找到任何似乎可以解决此问题的内容。
谢谢!
事实证明,解决方案很简单,尽管我的架构实施起来太困难了。 曲目 和 专辑都与作曲家相关联太麻烦了,所以我否决了这个想法。
我发现我使用的是 :albums
和 :tracks
而不是 :albums_attributes
和 :tracks_attributes
。这一变化使所有的关联魔法自动发生。
我是 Rails 的新手,想知道处理以下情况的正确 "Rails way" 是什么。我正在处理的应用程序是一个 Rails api-only 后端,带有 ReactJS 前端。在我的架构中,我有三个以各种方式关联的模型(稍后会详细介绍):作曲家、专辑、曲目。在客户端中,我创建了一个大致如下所示的对象:
{
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 自动处理。 (酷!)
我的问题是:
有没有办法在 POST
请求中发送上面的对象,解析出我可以设置正确关联的专辑和曲目?
我的幼稚方法(我当时正在客户端上设置...我真的不想在那里做那种业务逻辑)结果如下:
- 创建
Composer
记录并POST
到 Rails API。 - 创建
Album
记录并POST
到 Rails API。 - 创建所有
Track
记录和POST
到 Rails API。 - 使用作曲家和专辑 ID 更新每个
Track
。 - 更新
Album
以关联到Composer
。
我多宁愿在API中处理所有这些。 (特别是因为我需要处理 Album
已经存在并且需要 更新 而不是 创建 的情况。)
所以从本质上讲,我希望客户只需像上面那样提交带有嵌套实体的对象,然后我完成所有设置新 Composer
、Album
的工作, 以及后端的 Track
记录和关联。
这是可行的还是值得推荐的?如果是这样,我真的可以使用一个很好的文档来源或一个关于如何处理这种情况的教程。我的搜索技巧未能找到任何似乎可以解决此问题的内容。
谢谢!
事实证明,解决方案很简单,尽管我的架构实施起来太困难了。 曲目 和 专辑都与作曲家相关联太麻烦了,所以我否决了这个想法。
我发现我使用的是 :albums
和 :tracks
而不是 :albums_attributes
和 :tracks_attributes
。这一变化使所有的关联魔法自动发生。