Postgresql 许多协会都没有';不编辑变更集

Postgresql 许多协会都没有';不编辑变更集,postgresql,elixir,phoenix-framework,ecto,Postgresql,Elixir,Phoenix Framework,Ecto,我一直在尝试使用Ecto的多字段映射来获得一个连接表——可能是因为我不知道预加载应该如何工作,但每当我尝试更新关联(并通过这样做,插入到连接表中)时,我最终得到一个空的变更集和一个新的DB字段,这两个外键都为nil。我对菲尼克斯和埃克托还很陌生,我的谷歌搜索并没有让我走多远,因为很多埃克托都是相对较新的,也没有太多的文档 我的模型: defmodule SslStorage.Cert do use SslStorage.Web, :model alias SslStorage.User

我一直在尝试使用Ecto的多字段映射来获得一个连接表——可能是因为我不知道预加载应该如何工作,但每当我尝试更新关联(并通过这样做,插入到连接表中)时,我最终得到一个空的变更集和一个新的DB字段,这两个外键都为nil。我对菲尼克斯和埃克托还很陌生,我的谷歌搜索并没有让我走多远,因为很多埃克托都是相对较新的,也没有太多的文档

我的模型:

defmodule SslStorage.Cert do
  use SslStorage.Web, :model
  alias SslStorage.User
  alias SslStorage.UsersCerts

  schema "certs" do
    field :domain, :string
    field :port, :integer
    field :issuer, :string
    field :expiration, :string
    many_to_many :users, User, join_through: UsersCerts
    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:domain, :port, :issuer, :expiration])
    |> validate_required([:domain, :port, :issuer, :expiration])
  end
end

defmodule SslStorage.User do
  use SslStorage.Web, :model
  alias SslStorage.Cert
  alias SslStorage.UsersCerts

  schema "users" do
    field :email, :string
    many_to_many :certs, Cert, join_through: UsersCerts
    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:email])
    |> validate_required([:email])
  end
end

defmodule SslStorage.UsersCerts do
  use SslStorage.Web, :model
  alias SslStorage.User
  alias SslStorage.Cert

  schema "users_certs" do
    belongs_to :users, User
    belongs_to :certs, Cert
    timestamps()
  end

  def changeset(struct, params \\ %{}) do
    struct
    # my first clue something was funky:
    # casting and validating user_id & cert_id kept breaking things
    |> cast(params, [])
    # |> validate_required([:user_id, :cert_id])
  end
end
有问题的控制器代码(主要是复制自)

如果我从断点检查更改变量:

pry(6)> change
#Ecto.Changeset<action: nil,
 changes: %{users: [#Ecto.Changeset<action: :update, changes: %{},
     errors: [], data: #SslStorage.User<>, valid?: true>]}, errors: [],
 data: #SslStorage.Cert<>, valid?: true>
pry(7)> change.data
%SslStorage.Cert{__meta__: #Ecto.Schema.Metadata<:loaded, "certs">,
 domain: "spiceworks.com", expiration: "time", id: 1,
 inserted_at: #Ecto.DateTime<2016-08-31 15:00:49>, issuer: "me.com",
 port: 2222, updated_at: #Ecto.DateTime<2016-08-31 15:00:49>, users: []}
pry(6)>更改
#外部变更集
撬动(7)>更改数据
%SslStorage.Cert{{uuuuu meta}:#exto.Schema.Metadata,
域名:“spiceworks.com”,有效期:“time”,id:1,
插入地址:#exto.DateTime,发行人:“me.com”,
端口:2222,更新地址:#exto.DateTime,用户:[]
不知何故,这个协会并没有像我所期望的那样被建立起来,它可能需要指导。 当然,当调用Repo.update时,我会在数据库中得到一个新字段,其中包含user_id:nil和cert_id:nil

我的主要问题是:

  • 我甚至可以在尝试的时候完成一个带有外部关联的连接表,如果可以的话

  • 我做错了什么,因为我有点迷路了

  • pry(6)> change
    #Ecto.Changeset<action: nil,
     changes: %{users: [#Ecto.Changeset<action: :update, changes: %{},
         errors: [], data: #SslStorage.User<>, valid?: true>]}, errors: [],
     data: #SslStorage.Cert<>, valid?: true>
    pry(7)> change.data
    %SslStorage.Cert{__meta__: #Ecto.Schema.Metadata<:loaded, "certs">,
     domain: "spiceworks.com", expiration: "time", id: 1,
     inserted_at: #Ecto.DateTime<2016-08-31 15:00:49>, issuer: "me.com",
     port: 2222, updated_at: #Ecto.DateTime<2016-08-31 15:00:49>, users: []}