Ecto:根据现有行创建新行
Ecto: Create new row based on existing row
我正在尝试复制有更改的 postgres 行。 link
是现有行。我已经尝试了各种排列但无法创建变更集 - 欢迎帮助。
我正在使用这个版本的 ecto
:phoenix_ecto, "~> 3.0-rc"`
和这段代码
IO.inspect(link)
changeset =
link
|> Map.from_struct
# |> Map.delete(:id)
|> Upload.persist_changeset(params)
# new_link =
# Map.put link, :file_names, params["file_names"]
# case Repo.insert new_link do
case Repo.insert changeset do
{:ok, link} ->
render conn, "link.json", link: link.link
{:error, changeset} ->
...
end
和
def persist_changeset(model, params \ :empty) do
model
|> cast(params, ~w(upload_type file_names), ~w(job_id template_id estimate_ids))
end
IO.inspect
%Api.Upload{__meta__: #Ecto.Schema.Metadata<:loaded, "uploads">,
email: "hotbelgo@gmail.com", estimate_ids: [1],
file_names: ["f1.pdf", "f2.pdf"], id: 8,
inserted_at: #Ecto.DateTime<2016-08-04 10:01:21>,
job: #Ecto.Association.NotLoaded<association :job is not loaded>, job_id: 1,
link: "na2ClfJie4PsYC4y8Lr9",
template: #Ecto.Association.NotLoaded<association :template is not loaded>,
template_id: nil, updated_at: #Ecto.DateTime<2016-08-04 14:21:58>,
upload_type: "Artwork"}
错误
** (FunctionClauseError) no function clause matching in Ecto.Changeset.do_cast/4
这是link
的方案
defmodule MosaicApi.Upload do
use MosaicApi.Web, :model
schema "uploads" do
belongs_to :job, MosaicApi.Job
belongs_to :template, MosaicApi.Template
field :estimate_ids, {:array, :integer}
field :upload_type, :string
field :file_names, {:array, :string}
field :link, :string
field :email, :string
timestamps
end
我找到了解决方案,虽然我不确定这是最好的方法
update_params =
link
|> Map.from_struct
|> Map.put :file_names, params["file_names"]
changeset =
Upload.changeset(%Upload{}, update_params)
我正在尝试复制有更改的 postgres 行。 link
是现有行。我已经尝试了各种排列但无法创建变更集 - 欢迎帮助。
我正在使用这个版本的 ecto
:phoenix_ecto, "~> 3.0-rc"`
和这段代码
IO.inspect(link)
changeset =
link
|> Map.from_struct
# |> Map.delete(:id)
|> Upload.persist_changeset(params)
# new_link =
# Map.put link, :file_names, params["file_names"]
# case Repo.insert new_link do
case Repo.insert changeset do
{:ok, link} ->
render conn, "link.json", link: link.link
{:error, changeset} ->
...
end
和
def persist_changeset(model, params \ :empty) do
model
|> cast(params, ~w(upload_type file_names), ~w(job_id template_id estimate_ids))
end
IO.inspect
%Api.Upload{__meta__: #Ecto.Schema.Metadata<:loaded, "uploads">,
email: "hotbelgo@gmail.com", estimate_ids: [1],
file_names: ["f1.pdf", "f2.pdf"], id: 8,
inserted_at: #Ecto.DateTime<2016-08-04 10:01:21>,
job: #Ecto.Association.NotLoaded<association :job is not loaded>, job_id: 1,
link: "na2ClfJie4PsYC4y8Lr9",
template: #Ecto.Association.NotLoaded<association :template is not loaded>,
template_id: nil, updated_at: #Ecto.DateTime<2016-08-04 14:21:58>,
upload_type: "Artwork"}
错误
** (FunctionClauseError) no function clause matching in Ecto.Changeset.do_cast/4
这是link
defmodule MosaicApi.Upload do
use MosaicApi.Web, :model
schema "uploads" do
belongs_to :job, MosaicApi.Job
belongs_to :template, MosaicApi.Template
field :estimate_ids, {:array, :integer}
field :upload_type, :string
field :file_names, {:array, :string}
field :link, :string
field :email, :string
timestamps
end
我找到了解决方案,虽然我不确定这是最好的方法
update_params =
link
|> Map.from_struct
|> Map.put :file_names, params["file_names"]
changeset =
Upload.changeset(%Upload{}, update_params)