elixir - Ecto 在记录之间插入

标签 elixir phoenix-framework ecto

我对 Phoenix、Ecto 生态系统还很陌生。我正在尝试在表之间创建用于处理多对多关系。不幸的是,我不知道如何创建包含用户和事件数据的变更集(以插入它),并且在可用来源中查找该信息时遇到很大困难。你能帮忙吗?至少给我指出正确的方向?

当我做另一项关系任务时,我使用的是 build/2,但它只需要一个关联参数。

我创建了以下结构:

表 1,包含事件的数据:

schema "events" do
    field :name, :string
    field :address, :string

    field :location_x, :float
    field :location_y, :float

    field :date, Ecto.DateTime

    field :description, :string

    has_many :presences, Kpsz.Model.Presence
  end

表 2,用户数据:

schema "users" do
    field :login, :string
    field :password, :string
    field :email, :string

    field :role, :integer

    field :name, :string
    field :surname, :string
    field :class, :string
    field :phone_number, :string
    field :avatar, :string

    has_many :presences, Kpsz.Model.Presence

    timestamps
  end

中间的表保存事件的用户状态:

schema "presences" do
    belongs_to :user, Kpsz.Model.User, foreign_key: :user_id
    belongs_to :event, Kpsz.Model.Event, foreign_key: :event_id
  end

def changeset(user, params \\ :empty) do
    user
      |> cast(params, @required_fields, @optional_fields)
      |> foreign_key_constraint(:user_id)
      |> foreign_key_constraint(:event_id)
  end

最佳答案

以下架构定义应该可以完成您想要做的事情(根据您提供的架构进行简化):

defmodule Event do
  use Ecto.Model
  schema "events" do
    has_many :presences, Presence
    has_many :users, through: [:presences, :user]
  end
end

defmodule User do
  use Ecto.Model
  schema "users" do
    has_many :presences, Presence
    has_many :events, through: [:presences, :event]
  end
end

defmodule Presence do
  use Ecto.Model
  schema "presences" do
    belongs_to :user, User
    belongs_to :event, Event
  end
end

请参阅 Ecto.Schema.has_many/3 的文档使用 :through 选项了解更多信息。

预加载 :through 关联也会预加载连接的关联,例如:

iex> event = Event |> Repo.get!(1) |> Repo.preload([:users])
iex> # at this point, both event.presences and event.users have been loaded

也可以直接插入在线状态记录:

iex> presence = %Presence{ user_id: 1, event_id: 1 } |> Repo.insert!

关于elixir - Ecto 在记录之间插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164874/

相关文章:

functional-programming - 仅在 fa() 成功时调用 fb() 的最惯用方法

elixir - 如何通过本地网络连接两个 Elixir 节点?

elixir - 将映射转换为结构

elixir - Phoenix 生成器 phoenix.gen.json 与 mix phx.gen.json

elixir - 将表示日期的字符串传递给 Ecto 中的 postgres 查询

elixir - 如何检查字符串是否是有效的 UUID?

erlang - 升级到 OTP 18 会破坏 public_key 库的使用

phoenix-framework - Elixir Phoenix 内联 css 用于发送电子邮件

elixir - 在phoenix框架(elixir)中更改Url以接受字符串而不是id

elixir - Ecto 变更集和多对多关联 "is invalid"错误