我有一个带有这个(简化)模式的地址的ecto模型:
defmodule Address do
use Ecto.Model
schema "addresses" do
field :zip, :string
field :country, :string
# snip
end
@countries_requiring_zip ~w(US) # snip
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(country), ~w(zip))
|> validate_zip
end
defp validate_zip(changeset) do
if get_field(changeset, :country) in @countries_requiring_zip do
# ????
end
changeset
end
end
Run Code Online (Sandbox Code Playgroud)
我想标记zip为必需而不是可选,但仅当国家/地区是白名单时,但我无法找到一种干净的方式来编写验证.如何添加该约束?
我正在编写一个使用Exredis作为数据库的简单Web应用程序.Exredis文档说要初始化客户端:
{:ok, conn} = Exredis.start_link
Run Code Online (Sandbox Code Playgroud)
我的问题是,我在哪里放conn?现在,我正在调用Exredis.start_link\1每个需要进行数据库查询的函数的顶部,但这样做既嘈杂又低效.我可以通过conn,但这只是将问题转移到我的路由器.
我想在我的主应用程序启动时启动它,并在我的应用程序中重复使用单个连接.我可以将它作为工作人员添加到我的主管,但我无法弄清楚如何在我的应用程序的其余部分访问PID.
我有一个旧数据库,我正试图将其引入 Ecto。其中有一个orders表,其中有一order_status_id列。 order_status_id映射到遗留系统中的一组常量。
我想让MyApp.Order结构包含一个order_status字段,它有一个自定义类型,可以将整数 ID 转换为有意义的原子。我有自定义类型工作,但我无法弄清楚如何将名为的字段映射order_status到名为order_status_id.
遗留系统仍然在线并使用数据库,因此更改数据库架构不是一种选择。有没有办法让这个工作?