我最近开始与凤凰一起工作,事实是我通常使用NO 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调用类别名称。
问题是当插入帖子时,我创建了一个用于创建帖子的表单,我可以在其中选择类别,设置标题等...我的控制器通过模式匹配获取所有数据:
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。
我发现插入category_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_id
添加到传递给cast
的允许字段列表中:
|> cast(attrs, [:title, :author, :desc, :content, :content_raw, :logo, :category_id])
^^^^^^^^^^^^