【问题标题】:Capitalised fields in an Ecto modelEcto 模型中的大写字段
【发布时间】:2016-02-17 00:35:28
【问题描述】:

使用 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

访问大写字段会产生以下错误:

== 文件 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 语句并重命名该字段?创建范围?

是否有一致的方式来访问所有字段?

【问题讨论】:

  • 看看 Jose 的回答。

标签: elixir ecto


【解决方案1】:

只需替换字段名:

source_status.Hours_UnderOver

作者:

source_status."Hours_UnderOver"

你应该很高兴。请在 Phoenix 问题跟踪器上打开一个问题,以便我们可以预先生成正确的代码。

【讨论】:

  • 我知道可能有某种方法可以逃避这个名字。只是不知道如何在谷歌上找到答案。
  • 感谢何塞的回答。错误消息可能包含更多“提示”,但真正的问题是我是 Elixir 的新手,并且像 @Onorio 一样在 Google 上找不到任何快速帮助。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多