Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 将数据插入关联(?)_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 将数据插入关联(?)

Elixir 将数据插入关联(?),elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试在凤凰城建立一个基本数据库,并想要一个类似于视频的模型——基本上使用有很多——同时上传类似的 在我的例子中,我希望允许用户上传多个.csv,它们被添加到数据库中。现在,我将一个.csv上传限制在创建一个用户上,以集中精力完成这么多工作。我也不关心我将存储什么——现在,指向.csv所在位置的路径只是简单地开始。将来,我可能希望直接存储csv数据 我在用户参数中获得了%Plug.Upload,并且能够将其写入文件,但我不确定如何将该路径添加到数据库中 def change do alt

我正在尝试在凤凰城建立一个基本数据库,并想要一个类似于视频的模型——基本上使用
有很多
——同时上传类似的

在我的例子中,我希望允许用户上传多个.csv,它们被添加到数据库中。现在,我将一个.csv上传限制在创建一个用户上,以集中精力完成这么多工作。我也不关心我将存储什么——现在,指向.csv所在位置的路径只是简单地开始。将来,我可能希望直接存储csv数据

我在用户参数中获得了%Plug.Upload,并且能够将其写入文件,但我不确定如何将该路径添加到数据库中

def change do
  alter table(:users) do
    # Hmm, not sure if that should have been a :map.
    add :csvs, :map
  end
end
最新错误出现在用户/型号中(见下文)

以下是我目前掌握的情况:

模型/csv.ex

defmodule Test.CSV do
  use Test.Web, :model

  schema "csvs" do
    field :csv, {:array, :string}
    belongs_to :user, Test.User

    timestamps()
  end
  ...
models/user.ex

defmodule Test.User do
  use Test.Web, :model

  schema "users" do
    field :uname, :string
    field :group, :string

    has_many :csvs, Test.CSV
    timestamps()
  end
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:uname, :group])
    # Wasn't sure what else to do here. Currently throws an error at this line with 'protocol Enumerable not implemented for %Plug.Upload{...filename...etc.}'. 
    # I figure I probably need to specify somewhere that I only want a certain field, like the path, but I'm not sure how to do that.
    |> cast_assoc([:csvs])
    |> validate_required([:uname, :group])
  end
user_controller.ex

...
def create(conn, %{"user" => user_params}) do
  changeset = User.changeset(%User{}, user_params)

  case Repo.insert(changeset) do
    {:ok, _user} ->
      conn
      |> put_flash(:info, "User created successfully.")
      |> redirect(to: user_path(conn, :index))
    {:error, changeset} ->
      render(conn, "new.html", changeset: changeset)
  end
end
...
user/forms.html.eex

<%= form_for @changeset, @action, [multipart: true], fn f -> %>
...
<%= inputs_for f, :csvs, fn i -> %>
  <div class="form-group">
  <label>CSV</label>
  <%= file_input i, :csv, class: "form-control" %>
  </div>
<% end %>
...
<% end %>

然后是我是否应该使用嵌套的关联(正确的术语?),或者采用嵌入式模式。不用说,我对菲尼克斯还不熟悉,如果能想到如何解决这个问题,我将不胜感激。谢谢

我真的很惊讶,您是如何在schema
{:array,:string}
中使用这种表示法的。。。对于您的案例,最简单的解决方案是在
用户
CSV
之间建立
多个
关系,并且此部分有效

现在取决于您如何在数据库中存储关于这些CSV的信息-如果您处理Plug.Upload,它只不过是文件,但您需要自定义Ecto如何处理这种类型,因为文件是一个复杂的结构

另一种方法是解析该CSV文件,然后将其放入
CSV
表中,并将其与
User
关联,最好的方法可能是使用CSV插件读取该文件或任何其他文件的内容,并将其与
put\u assoc
相结合


就我个人而言,我不会将整个文件存储在数据库中,而是在需要时引用它,例如文件名和内容。

我真的很惊讶您是如何在模式
{:array,:string}
中使用这种表示法的。。。对于您的案例,最简单的解决方案是在
用户
CSV
之间建立
多个
关系,并且此部分有效

现在取决于您如何在数据库中存储关于这些CSV的信息-如果您处理Plug.Upload,它只不过是文件,但您需要自定义Ecto如何处理这种类型,因为文件是一个复杂的结构

另一种方法是解析该CSV文件,然后将其放入
CSV
表中,并将其与
User
关联,最好的方法可能是使用CSV插件读取该文件或任何其他文件的内容,并将其与
put\u assoc
相结合


就我个人而言,我不会将整个文件存储在数据库中,但是如果需要的话,我会引用它,例如文件名和内容。

在遇到类似问题后,那篇文章为我提供了适当的背景知识,以帮助我自己。我认为你应该预装你的CSV。请展示你的表格开头的样子。我认为这应该是类似于f的
inputs\u,:csvs,fn I->
我已经翻阅了很多不同的文章,我不确定我应该怎么做。我喜欢凤凰城的很多方面,但这一部分似乎有太多潜在的解决方案,很难知道该追求哪一个。如果有一种简单的内置方式来处理我忽略的%Plug.Upload{},那就太好了@Johannes,我尝试使用输入(将编辑我的帖子以反映这一点),但现在文件输入表单不再显示。不知道如何从那里开始。。。也许你链接的那篇文章也有介绍。在遇到类似问题后,那篇文章给了我适当的背景来帮助我自己。我认为你应该预装你的CSV。请展示你的表格开头的样子。我认为这应该是类似于f的
inputs\u,:csvs,fn I->
我已经翻阅了很多不同的文章,我不确定我应该怎么做。我喜欢凤凰城的很多方面,但这一部分似乎有太多潜在的解决方案,很难知道该追求哪一个。如果有一种简单的内置方式来处理我忽略的%Plug.Upload{},那就太好了@Johannes,我尝试使用输入(将编辑我的帖子以反映这一点),但现在文件输入表单不再显示。不知道如何从那里开始。。。也许你链接的那篇文章里有。