【问题标题】:Get required and optional fields from changeset从变更集中获取必填和可选字段
【发布时间】:2018-02-13 09:10:19
【问题描述】:

我在Ecto.schema 中读到,我们可以通过这样做获得字段的fieldstypes

Model.__schema__(:fields)
Model__schema__(:types)

我有模块属性常量@required_fields@optional_fields

我们有什么方法可以从变更集或架构函数中获取 @required_fields@optional_fields

谢谢

【问题讨论】:

  • 这里的必需和可选是什么意思?该字段可以是虚拟的/非虚拟的,但我没有看到任何方法可以在架构定义中使字段成为必需和可选。
  • @Dogbert 让我向您展示架构。我说的是
  • 什么是attr?我在 Ecto 的文档中没有看到它。
  • 如果您只是想避免变更集中的代码重复,您可以将它们声明为模块属性@required_fields [...]
  • @Dogbert 我在变更集中设置了@required_fields。我只想将它们作为数组或列表获取。无论如何,我们是否通过变更集功能获得它们。你认为有可能吗?

标签: elixir ecto


【解决方案1】:

如果您想在 changeset cast 函数中添加必填字段和可选字段,您可以这样做:

  # using sigils list of words
  @required_fields ~w(field1 field2 field3)
  @optional_fields ~w()

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @required_fields, @optional_fields)
    |> cast_assoc(:message_details)
  end

从这个Elixir Forum 帖子看来,您似乎无法直接访问这些必填字段。一个建议是创建一个返回这些字段的函数或宏:

更新

def required_fields_for model do
  model.__ schema__(:fields)
  |> Enum.filter(fn field -> field in @required_fields end)
end

给定一个模型,这将返回必填字段。

【讨论】:

  • 我已经添加了 required_fields。我的问题是如何通过某些功能获得必需和可选字段
  • 但为此我必须对 required_feilds 进行硬编码,然后通过 Ecto.__schema__(:fields) 过滤它们。我希望它们根据给定的模型动态获取。
  • 嗯,required_fields 本质上是硬编码到您的应用程序中的,因为它们不会真正受到您的应用程序代码的更改。但我明白你的意思。让我更新我的答案。
  • 模块属性常量不能在模块外访问。在上面的代码中,它将返回 nil。但无论如何感谢您的回答。 :)
  • 您需要导入该特定功能才能使其工作
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
相关资源
最近更新 更多