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