使用ECTO嵌入式架构验证查询参数并将其保留为数据库中的字符串
我有一个带有:字符串
参数的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类型,但我不确定这是否是正确的解决方案。
最后,我需要以下内容:
- 一种简单的方法来生成不同
键
- &gt;值
查询参数的。 - 验证不同
键
- &gt;值
参数。 - 将它们编码到最终字符串中以持续到数据库中的方法。
我想知道是否有一种方法可以用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:
- An easy way to generate forms for the different
key
->value
of the query params. - A way to validate the different
key
->value
params. - 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论