Elixir 关于外胚层关联的几个问题

Elixir 关于外胚层关联的几个问题,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我最近开始与phoenix合作,事实上我通常不使用SQL数据库 我正在写一个经典的博客来整合关联。 我创建了一个基本的关联: 帖子属于一个类别 一个与许多职位相同的类别 以下是这些模式: schema "categories" do field :category_name, :string field :logo, :string has_many :posts, Lclp.Post timestamps() end schema "posts" d

我最近开始与phoenix合作,事实上我通常不使用SQL数据库

我正在写一个经典的博客来整合关联。 我创建了一个基本的关联:

  • 帖子属于一个类别
  • 一个与许多职位相同的类别
以下是这些模式:

schema "categories" do
    field :category_name, :string
    field :logo, :string
    has_many :posts, Lclp.Post

    timestamps()
  end

schema "posts" do
 field :author, :string
 field :content, :string
 field :content_raw, :string
 field :desc, :string
 field :logo, :string
 field :title, :string
 belongs_to :category, Lclp.Category

 timestamps()
end
这一个,工作正常,我可以在预加载后从帖子的category_id调用category name

问题是当插入一篇文章时,我已经创建了一个表单来创建一篇文章,在这里我可以选择类别,设置标题,等等。。。我的控制器通过模式匹配获取所有数据:

def create_post(conn, %{"post" => post}) do
      IO.inspect(post)
      changeset = Lclp.Post.add_post(%Lclp.Post{}, post)
      IO.inspect(changeset)

      case Lclp.Repo.insert(changeset) do
        {:ok, data} ->
          conn
          |> put_flash(:info, "Post bien ajouté")
          |> redirect(to: adminpost_path(conn, :index))
        {:error, changeset} ->
          conn
          |> assign(:section, "Creation d'un post (callback error)")
          |> render("new.html", changeset: changeset, categories_tab: Lclp.Category.get_categories_name)
      end
    end
除了category_id和保持为NULL的字段外,所有字段都添加到数据库中

我发现插入类别id的唯一解决方案是:

def changeset(post, attrs \\ %{}) do
    post
    |> cast(attrs, [:title, :author, :desc, :content, :content_raw, :logo])
    |> validate_required([:title, :author, :desc, :content, :content_raw])
  end

  def add_post(post, attrs) do
    post
    |> changeset(attrs)
    |> change(%{category_id: String.to_integer(Map.fetch!(attrs, "category_id"))})
  end
这很有效,但我觉得这不是一个好方法

如果有人知道我做错了什么


谢谢

您不需要手动执行此操作,只需将
category\u id
添加到传递给
cast
的允许字段列表中即可:

|> cast(attrs, [:title, :author, :desc, :content, :content_raw, :logo, :category_id])
                                                                       ^^^^^^^^^^^^

如何将
:category_id
添加到传递给
cast
的字段列表中?它成功了!事实上,当我尝试使用cast时,我使用了:category作为字段键,显然它试图使用毫无意义的关联。谢谢你的帮助help@ClerisseLucas请花点时间回答这个问题,解释什么是错误的,以及它是如何解决的。因此,它是面向未来用户的知识库,因此必须表达这些知识。