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,我尝试使用输入(将编辑我的帖子以反映这一点),但现在文件输入表单不再显示。不知道如何从那里开始。。。也许你链接的那篇文章里有。