使用ECTO嵌入式架构验证查询参数并将其保留为数据库中的字符串

发布于 2025-01-24 09:49:50 字数 1403 浏览 0 评论 0原文

我有一个带有:字符串参数的ecto架构,它将将URI查询字符串持续到数据库中:

defmodule Config do
  use Ecto.Schema
  import Ecto.Changeset

  schema "configs" do
    field :query_params, :string
  end
end

即使最终将查询字符串保存在数据库中,我也需要一种验证和编码的方法最终字符串中的不同参数。

为此,我创建了以下嵌入式架构:

defmodule QueryParam do
  use Ecto.Schema
  import Ecto.Changeset

  @invalid_keys ~w(name)

  @primary_key false

  embedded_schema do
    field :key, :string
    field :value, :string
  end

  def changeset(query_param, attrs) do
    query_param
    |> cast(attrs, [:key, :value])
    |> validate_required([:key, :value])
    |> validate_exclusion(:key, @invalid_keys)
  end
end

假设我可以将上述嵌入式模式使用config>配置 schema带有以下更改:

defmodule Config do
  use Ecto.Schema
  import Ecto.Changeset

  schema "configs" do
    field :query_params, :string
    embeds_many :params, QueryParam
  end
end

此解决方案可以使我可以轻松地使用inputs_for生成表单。助手,但问题是我不想坚持:params进入数据库(and virtual:true不与embeds_many < /代码>)。

我尝试定义自定义ECTO类型,但我不确定这是否是正确的解决方案。

最后,我需要以下内容:

  1. 一种简单的方法来生成不同 - &gt; 查询参数的。
  2. 验证不同 - &gt; 参数。
  3. 将它们编码到最终字符串中以持续到数据库中的方法。

我想知道是否有一种方法可以用ECTO和Phoenix对此问题进行建模,然后再将JS旋转到总前端解决方案。

I have a Ecto schema with a :string param that will persist a URI query string into the database:

defmodule Config do
  use Ecto.Schema
  import Ecto.Changeset

  schema "configs" do
    field :query_params, :string
  end
end

Even if the query string is finally saved as a string into the database I need a way to validate and encode the different params into the final string.

To do this I have created the following embedded schema:

defmodule QueryParam do
  use Ecto.Schema
  import Ecto.Changeset

  @invalid_keys ~w(name)

  @primary_key false

  embedded_schema do
    field :key, :string
    field :value, :string
  end

  def changeset(query_param, attrs) do
    query_param
    |> cast(attrs, [:key, :value])
    |> validate_required([:key, :value])
    |> validate_exclusion(:key, @invalid_keys)
  end
end

Assuming that I can use the above embedded schema into the Config schema with the following change:

defmodule Config do
  use Ecto.Schema
  import Ecto.Changeset

  schema "configs" do
    field :query_params, :string
    embeds_many :params, QueryParam
  end
end

This solution could allow me to easily generate forms with inputs_for helper but the problem is that I don't want to persist :params into the database (and virtual: true does not work with embeds_many).

I have tried defining a custom Ecto Type but I'm not sure if it's the right solution.

At the end I need the following:

  1. An easy way to generate forms for the different key -> value of the query params.
  2. A way to validate the different key -> value params.
  3. A way to encode these into a final string to be persisted into the database.

I would like to know if there is a way to model this problem with Ecto and Phoenix before pivoting to a total frontend solution with JS.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文