忽略未能在changeset中检查foreign_key的记录

时间:2018-07-26 01:36:15

标签: elixir ecto

我正在从外部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并遍历每个选秀权的插入,以免出现错误不会触发所有有效记录插入的回滚。

我是否正在考虑这个错误,并且是否有一种简单的方法可以实现我的目标?

0 个答案:

没有答案