我正在从外部API提取数据,在该API中,我将使用以下方法获取梦幻足球选秀和相关选秀权:
%Draft{}
|> cast(data, [:division, :completed, :league_id])
|> cast_assoc(:draft_picks)
选秀权的变更集功能为:
def changeset(draft_pick, data) do
draft_pick
|> cast(data, [:player_id, :timestamp, :pick_number])
|> foreign_key_constraint(:player_id)
|> case do
# The goal is to just ignore (don't insert) draft pick
# records for players that aren't valid (for any reason,
# including not being in the players table)
%{valid?: false} = changeset ->
%{changeset | action: :ignore}
changeset ->
changeset
end
end
问题是我在架构中定义了一个外键,但现实情况是每个草拟的球员不一定都在球员表中(联赛允许自定义球员并在选秀记录中为他们分配ID,而无需创建玩家表中的相应记录。
但是,我很幸运,因为我不在乎这些习惯球员的选秀权;我很乐意忽略这些记录。上面的代码是我尝试获取调用cast_assoc
来加载所有草稿和草稿的尝试,但是由于players表中缺少记录而导致外键错误的情况下,请不要插入草稿并继续前进。
请注意,player_id
是玩家表中主键的名称,也是选秀权表中外键的名称;在模式中适当设置的;如果给定草稿中没有自定义玩家,则此代码可以正常工作。
我认为这失败了(即,当违反约束条件时,对草稿的插入操作并且回滚其所有选择项,而不是忽略有问题的记录),因为数据库在插入时检查约束,而不是在数据库中检查约束当构造变更集时,因此valid?
在此处选中时为true。我想我可以编写一个自定义验证器来检查每个选秀权的球员表,并将选秀权缺失的球员标记为无效,或者我可以完全抛弃cast_assoc
并遍历每个选秀权的插入,以免出现错误不会触发所有有效记录插入的回滚。
我是否正在考虑这个错误,并且是否有一种简单的方法可以实现我的目标?