gpt4 book ai didi

elixir - 如何切换更新模型 bool 属性?

转载 作者:行者123 更新时间:2023-12-01 03:37:06 25 4
gpt4 key购买 nike

如何切换 active更新操作中的 bool 属性?我习惯了 Rails,Phoenix 有什么好的做法?

示例代码:

defmodule Todo.task do
use Todo.Web, :model

schema "task" do
field :active, :boolean, default: false

timestamps
end

@required_fields ~w(active)
@optional_fields ~w()

def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end

defmodule Todo.TaskController do
use Todo.Web, :controller
alias Todo.Task

def update(conn, %{"id" => id}) do
task = Repo.get_by(Task, id: id)
# task.active = !task.active
# task.save
render(conn, "show.json", task: task)
end
end

最佳答案

您可以使用 Ecto.Changeset使用您的新事件状态,然后调用 Repo.update/2 .

  def update(conn, %{"id" => id}) do
task = Repo.get_by(Task, id: id)
changeset = Task.changeset(task,%{active: !task.active})
case Repo.update(changeset) do
{:ok, task} -> redirect(conn, to: task_path(conn, :show, task))
{:error, changeset} -> render(conn, "edit.html", changeset: changeset)
end
end

调用 Repo.update 时的模式匹配或 Repo.insert是您想要做的事情的最佳实践。

通常你会用你在函数中匹配的参数调用更新:
  def update(conn, %{"id" => id, "task" => task_params}) do
changeset = Task.changeset(task, task_params)
case ...
end
changeset/2在您的模型上定义的函数将确保只能修改指定的字段。如果更新时这些与字段不同,请考虑创建 update_changeset/2功能。这个函数没有什么特别之处,你可以定义和使用尽可能多的函数来返回一个变更集。

关于elixir - 如何切换更新模型 bool 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33632851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com