代码之家  ›  专栏  ›  技术社区  ›  script

在单个事务中插入多个变更集

  •  1
  • script  · 技术社区  · 6 年前

    我有张桥牌桌:

    schema "rooms_units" do
      field(:date_from, :utc_datetime)
      field(:date_to, :utc_datetime)
      belongs_to(:room, App.Room, primary_key: true)
      belongs_to(:unit, App..Unit)
    end
    

    我有来自端点的映射列表,并为每个映射创建了一个变更集列表。

    [
    
    #Ecto.Changeset<
     action: nil,
    changes: %{
      date_from: #DateTime<2016-11-03 13:23:00Z>,
      date_to: #DateTime<2016-11-03 13:23:00Z>,
      room_id: 255,
      unit_id: 296
    },
    errors: [],
    data: #App.RoomUnit<>,
    valid?: true
    
    #Ecto.Changeset<
    action: nil,
    changes: %{
      date_from: #DateTime<2016-11-03 13:23:00Z>,
      date_to: #DateTime<2016-11-03 13:23:00Z>,
      room_id: 256,
      unit_id: 296
    },
    errors: [],
    data: #App.RoomUnit<>,
    valid?: true
    >
    ]
    

    我想把它插入 rooms_units 单事务中的表。

    我试过 Ecto.multi.insert_all . 但它接受的是映射列表,而不是变更集。有什么别的功能不能帮我吗

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aleksei Matiushkin    6 年前

    使用 MyRepo.transaction/2 .

    MyRepo.transaction(fn ->
      Enum.each(changesets, &MyRepo.update!(&1, []))
    end)