如何从终端更新模型的布尔属性

How to Update a Model's Boolean Attribute From Terminal

我的 Phoenix 应用程序中的用户模型有一个布尔属性。

如何通过 terminal/command 提示更新此属性?

例如 - 在 Rails 控制台(运行 rails c 在我的终端)我可以这样做:

u = User.find(1)

u.admin = true

u.save

在菲尼克斯执行此操作的最佳方法是什么? (也许通过 iex -S mix?- 我认为这是最接近 rails c 的东西)。

你是正确的 iex -S mix 将打开一个控制台。

您必须使用 Ecto.Changeset 结构来进行更改。 Ecto.Changeset.change/2 是进行任意更改的最简单方法:

alias MyApp.{Repo, User} # for convenience, not required
user = Repo.get(User, 1)
Ecto.Changeset.change(user, %{admin: true}) |> Repo.update!

请注意,如果您想在进行此类更新时 运行 您的用户验证,您可能需要使用模型中定义的函数(默认情况下 changeset/2)。

虽然@Gazler 的回答显然是正确的,但我认为有更简单的方法可以得到相同的结果。

您可以尝试类似的方法:

u = App.Repo(User, 1) # corresponds to -> u = User.find(1)

u = %{ u | admin: true } # corresponds to -> u.admin = true

App.Repo.update(u) # corresponds to -> u.save

您需要注意,使用这种方法,更改不会成为验证的主题,但是,如果您想进行简单而安全的更改,可能不需要达到 changeset.

希望对您有所帮助!