Phoenix Ecto - 模型方法中的变量
Phoenix Ecto - Variable in model method
我正在使用 Phoenix 网络框架 (Elixir) 重写我们现有的基于 python 的 API 交付服务 运行 成为一个小问题。
我正在尝试创建一个基本的模型方法,当调用它时,您向它传递一个序列号,它通过 Ecto 查询数据库并 returns 结果。查看文档我应该能够使用插值来定义查询中的变量,但我仍然遇到错误。
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
我收到以下编译错误:
== Compilation error on file web/controllers/opt_controller.ex ==
** (Ecto.Query.CompileError) variable serial
is not a valid query expression. Variables need to be explicitly interpolated in queries
with ^
expanding macro: Ecto.Query.where/3
web/controllers/opt_controller.ex:12: Webservices.OPTController.index/2
(elixir) expanding macro: Kernel.|>/2
web/controllers/opt_controller.ex:13: Webservices.OPTController.index/2
(elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
您加入了两个 table,并且在您的 t
table 中有 :serial
字段。在 c
中有 :serial_number
。只需在 t.serial == ^serial
.
上应用此 where
子句
我正在使用 Phoenix 网络框架 (Elixir) 重写我们现有的基于 python 的 API 交付服务 运行 成为一个小问题。
我正在尝试创建一个基本的模型方法,当调用它时,您向它传递一个序列号,它通过 Ecto 查询数据库并 returns 结果。查看文档我应该能够使用插值来定义查询中的变量,但我仍然遇到错误。
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
我收到以下编译错误:
== Compilation error on file web/controllers/opt_controller.ex == ** (Ecto.Query.CompileError) variable
serial
is not a valid query expression. Variables need to be explicitly interpolated in queries with ^ expanding macro: Ecto.Query.where/3 web/controllers/opt_controller.ex:12: Webservices.OPTController.index/2 (elixir) expanding macro: Kernel.|>/2 web/controllers/opt_controller.ex:13: Webservices.OPTController.index/2 (elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
您加入了两个 table,并且在您的 t
table 中有 :serial
字段。在 c
中有 :serial_number
。只需在 t.serial == ^serial
.
where
子句