Ecto 模型中的大写字段
Capitalised fields in an Ecto model
使用 Ecto 访问大写字段的最佳方式是什么?
我必须处理一个相当混乱的架构。一些列是大写的。
我设置了以下模型:
defmodule SourcesApi.SourceStatus do
use SourcesApi.Web, :model
# schema "source_statuses" do
schema "source_statuses" do
field :Hours_UnderOver, :integer
field :trafficlight, :string
...
timestamps
end
@required_fields ~w(Hours_UnderOver trafficlight)
@optional_fields ~w()
def changeset(model, params \ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
以及相应的视图:
defmodule SourcesApi.SourceStatusView do
use SourcesApi.Web, :view
def render("index.json", %{source_statuses: source_statuses}) do
%{data: render_many(source_statuses, SourcesApi.SourceStatusView, "source_status.json")}
end
def render("source_status.json", %{source_status: source_status}) do
%{status: source_status.trafficlight,
delay: source_status.Hours_UnderOver,
end
end
访问 Capitalized 字段产生以下错误:
== 文件 web/views/source_status_view.ex 编译错误 ==
** (CompileError) web/views/source_status_view.ex:12: 别名必须在编译时扩展为原子,但在 "source_status.Hours_UnderOver" 中没有。如果要动态生成别名,请使用 Module.concat/2
大写字段很难看,但完全有效。
Ecto 应该处理它们吗?
我是不是做错了什么?我是 Elixir / Ecto 的新手。
有没有办法在某个时候注入 select 语句并重命名该字段?创建范围?
是否有一种访问所有字段的一致方式?
只需替换字段名称:
source_status.Hours_UnderOver
作者:
source_status."Hours_UnderOver"
你应该可以开始了。请在 Phoenix 问题跟踪器上提出问题,以便我们可以预先生成正确的代码。
使用 Ecto 访问大写字段的最佳方式是什么?
我必须处理一个相当混乱的架构。一些列是大写的。
我设置了以下模型:
defmodule SourcesApi.SourceStatus do
use SourcesApi.Web, :model
# schema "source_statuses" do
schema "source_statuses" do
field :Hours_UnderOver, :integer
field :trafficlight, :string
...
timestamps
end
@required_fields ~w(Hours_UnderOver trafficlight)
@optional_fields ~w()
def changeset(model, params \ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
以及相应的视图:
defmodule SourcesApi.SourceStatusView do
use SourcesApi.Web, :view
def render("index.json", %{source_statuses: source_statuses}) do
%{data: render_many(source_statuses, SourcesApi.SourceStatusView, "source_status.json")}
end
def render("source_status.json", %{source_status: source_status}) do
%{status: source_status.trafficlight,
delay: source_status.Hours_UnderOver,
end
end
访问 Capitalized 字段产生以下错误:
== 文件 web/views/source_status_view.ex 编译错误 == ** (CompileError) web/views/source_status_view.ex:12: 别名必须在编译时扩展为原子,但在 "source_status.Hours_UnderOver" 中没有。如果要动态生成别名,请使用 Module.concat/2
大写字段很难看,但完全有效。
Ecto 应该处理它们吗?
我是不是做错了什么?我是 Elixir / Ecto 的新手。
有没有办法在某个时候注入 select 语句并重命名该字段?创建范围?
是否有一种访问所有字段的一致方式?
只需替换字段名称:
source_status.Hours_UnderOver
作者:
source_status."Hours_UnderOver"
你应该可以开始了。请在 Phoenix 问题跟踪器上提出问题,以便我们可以预先生成正确的代码。