【问题标题】:Phoenix Ecto - Variable in model methodPhoenix Ecto - 模型方法中的变量
【发布时间】:2017-06-09 20:44:39
【问题描述】:

我正在使用 Phoenix Web 框架 (Elixir) 重写我们拥有的基于 python 的 API 交付服务,但遇到了一个小问题。

我正在尝试创建一个基本模型方法,当调用它时,您传递一个序列号,它通过 Ecto 查询数据库并返回结果。通过查看文档,我应该能够使用插值来定义查询中的变量,但仍然出现错误。

lib/test_result.ex 文件

defmodule Webservices.TestResult do
  use Ecto.Schema

      schema "test_result" do
            field :date_added, Ecto.DateTime
            field :serial, :string
            field :sequence_id, :integer
            field :last_completed_stage, :integer
            field :last_completed_sequence, :integer
            field :workorder, :string
            field :product, :string
            field :is_complete, :integer
            field :is_scrapped, :integer
            field :value_stream, :string
            field :promise_date, Ecto.Date
            field :fail_lock, :integer
            field :sequence_rev, :integer
            field :date_updated, Ecto.DateTime
            field :date, Ecto.Date
            field :time, Ecto.Time
            field :ptyp2, :string
            field :wo_qty, :integer
            field :is_active, :integer
            field :is_time_lock, :integer
            field :time_lock_timestamp, Ecto.DateTime
            field :scrap_reason, :string
            field :scrapped_by, :integer
      end
  end

lib/test_result_detail.ex 文件

defmodule Webservices.TestResultDetail do
  use Ecto.Schema, :model
  import Ecto.Query

  schema "test_result_detail" do
    field :status_id, :integer
    field :station_id, :integer
    field :stage_id, :integer
    field :operator_id, :integer
    field :failstep, :string
    field :shift, :integer
    field :sequence_rev, :integer
    field :date_added, Ecto.Date
    field :date_timestamp, Ecto.DateTime
    field :date_time, Ecto.Time
    field :stage_order, :integer
    field :serial_number, :string
    field :is_retest, :integer
    field :retest_reason, :string

    has_many :result_id, Webservices.TestResult
end


  def last_completed_test(serial) do
    from c in Webservices.TestResultDetail,
      join: t in TestResult, on: t.id == c.result_id,
      select: {t.serial, c.station_id, c.stage_id, c.operator_id, c.sequence_rev},
      where: t.serial == ^serial,
      order_by: [desc: c.id],
      limit: 1
  end

end

我的控制器:

defmodule Webservices.OPTController do
    use Webservices.Web, :controller

    alias Webservices.Router
    import Webservices.Router.Helpers

    def last(conn, %{"serial" => serial}) do
        import Ecto.Query

        results = Webservices.TestResultDetail.last_completed_test(serial)
        render(conn, "last.json", results: results)

    end
end

我收到以下编译错误:

== 文件 web/controllers/opt_controller.ex 上的编译错误 == ** (Ecto.Query.CompileError) 变量 serial 不是有效的查询表达式。变量需要在查询中显式插值 与 ^ 扩展宏:Ecto.Query.where/3 web/controllers/opt_controller.ex:12: Webservices.OPTController.index/2 (elixir) 扩展宏:Kernel.|>/2 web/controllers/opt_controller.ex:13: Webservices.OPTController.index/2 (elixir) lib/kernel/parallel_compiler.ex:117: Kernel.ParallelCompiler.spawn_compilers/1 中的匿名 fn/4

【问题讨论】:

  • where: c.serial == ^serial -> where: c.serial_number == ^serial
  • 而不是t。我创建了一个答案。
  • c.serial 是指向另一个有序列字段的表的 FK 链接。在 test_result_detail 表中没有使用 serial_number 字段,很抱歉造成混淆。我在上面更新了我的问题

标签: elixir phoenix-framework ecto


【解决方案1】:

您加入了两个表,并且在您的 t 表中有 :serial 字段。在c 中有:serial_number。只需在 t.serial == ^serial 上应用此 where 子句即可。

【讨论】:

  • 这绝对是一个胖手指不错的选择。我已更新,但仍然看到相同的错误。
  • 呃,这实际上是我在另一个文件中的另一个错字的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
相关资源
最近更新 更多