通过 handle_in in channel 向数据库中插入数据

Through handle_in in channel to insert data into database

我有 table 用于 table 和订单。订单和table的关系是Order属于table,table有很多订单。所以在顺序 table 的其中一列中有 table_id。而且 table 有一列 current_order 以保持 order_id 当前 table 当前拥有。

我有一个 table:show 频道,它显示了 table 的所有列表。当用户单击 table 时,它会推送 table:busy 并发送 table_id 已单击的 table。

因此,在 table 频道中,table:busy 有 handle_in,我想使用从 table:show 频道发送的 table_id 创建订单.

def handle_in("table:busy", %{"table_id" => table_id}, socket) do
    table = Repo.get(Pos1.Table, table_id)
    changeset = table
        |> assoc(:orders)
        |> Pos1.Order.changeset(:table_id)

    case Repo.insert(changeset) do
        {:ok, order}->
    changesettable = Table.changeset(table, %{current_order: order.id})
    table = Repo.update!(changesettable)
    {:noreply, socket}

    {:error, changeset} ->
        {:reply, {:error, %{error: "Error creating order"}}, socket}

    end

end

这是错误信息:

---[error] GenServer #PID<0.1327.0> terminating
** (UndefinedFunctionError) function Ecto.Query.__changeset__/0 is undefined or private
    (ecto) Ecto.Query.__changeset__()
    (ecto) Ecto.Changeset.do_cast/4
    (pos1) web/channels/table_channel.ex:18: Pos1.TableChannel.handle_in/3
    (phoenix) lib/phoenix/channel/server.ex:225: anonymous fn/4 in Phoenix.Channel.Server.handle_info/2

以上错误显示未定义变更集...如何定义变更集以将数据插入 Orders table?

提前致谢..

---编辑 1

defmodule Pos1.Order do
 use Pos1.Web, :model

schema "orders" do

field :number_of_customers, :integer
field :completed, :boolean, default: false
field :confirmed, :boolean, default: false
field :service_charge, :boolean, default: true
field :total, :integer, default: 0
field :discount, :float, default: 0.0
field :current_select, :integer, default: 1
field :payed, :float
field :finalized, :boolean, default: false
field :served, :boolean, default: false
field :current_round, :integer, default: 0
field :rounds, :integer, default: 1
field :created_date, Ecto.DateTime
belongs_to :table, Pos1.Table
belongs_to :payment, Pos1.Payment
has_many :order_items, Pos1.OrderItem
belongs_to :staff, Pos1.Staff

timestamps
end

  @required_fields ~w(number_of_customers table_id completed confirmed 
                  total service_charge current_select finalized served
                  rounds current_round)
  @optional_fields ~w(payment_id discount staff_id payed created_date)


 def changeset(model, params \ :empty) do
   model
   |> cast(params, @required_fields, @optional_fields)
  end
end

此错误是由 Orders 模型的 @required_fields 引起的。

我没有通过每个 @required_fields 所以它没有创建订单。

我将一些 @required_fields 移动到 @optional_fields 并且它起作用了。