Ecto插入中间记录

时间:2015-12-08 19:56:01

标签: 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

1 个答案:

答案 0 :(得分:2)

以下架构定义应该完成您想要做的事情(从您提供的架构中简化):

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/3http://www.htmlgoodies.com/beyond/javascript/read-text-files-using-the-javascript-filereader.html#fbid=wUtRDwEASPK文档。

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

:through

插入iex> event = Event |> Repo.get!(1) |> Repo.preload([:users]) iex> # at this point, both event.presences and event.users have been loaded 记录也可以直接进行:

Presence