gpt4 book ai didi

ruby-on-rails - 使用 RubyOnRails 验证 jsonb 对象数组中的对象

转载 作者:行者123 更新时间:2023-12-04 03:36:11 25 4
gpt4 key购买 nike

您将如何使用 Rails 验证对象数组中的每个对象?

我正在我们的 Rails 应用程序中构建用户配置文件表单。在用户模型中,我们有基本的字符串属性,但也有一些 jsonb 字段。 JSONb 字段默认为 [],因为我们希望在该属性中存储一组对象。以下是简化的用户模型属性示例:

  • name: string
  • email: string
  • education: jsonb, default: []

  • 教育是一系列对象,例如:
    [{
    school: 'Harvard university',
    degree: 'Computer Science',
    from_date: 'Tue, 11 Jul 2017 16:22:12 +0200`,
    to_date: 'Tue, 11 Jul 2017 16:22:12 +0200'
    },{
    school: 'High school',
    degree: 'Whatever',
    from_date: 'Tue, 11 Jul 2017 16:22:12 +0200`,
    to_date: 'Tue, 11 Jul 2017 16:22:12 +0200'
    }]

    用户应该能够单击添加学校按钮,通过 jquery 添加更多字段。 jquery 部分对于这个问题并不重要——也许只是解释为什么我们使用对象数组。

    您将如何验证教育数组中的每个项目,以便我可以用红色标记包含验证错误的文本字段?有人建议我在这里使用 FormObject 模式可能会有所帮助。我也尝试编写从 ActiveModel::Validator 类继承的自定义验证器,但主要问题仍然在于事实上,我正在处理一个数组,而不是实际对象。

    感谢任何 build 性的帮助。

    最佳答案

    您可以通过为它们引入非数据库支持的 ActiveModel 模型类,将教育记录视为 Rails 模型层中的一等公民:

    class Education
    include ActiveModel::Model

    attr_accessor :school, :degree, :from_date, :to_date

    validates :school, presence: true
    validates :degree, presence: true

    def initialize(**attrs)
    attrs.each do |attr, value|
    send("#{attr}=", value)
    end
    end

    def attributes
    [:school, :degree, :from_date, :to_date].inject({}) do |hash, attr|
    hash[attr] = send(attr)
    hash
    end
    end

    class ArraySerializer
    class << self
    def load(arr)
    arr.map do |item|
    Education.new(item)
    end
    end

    def dump(arr)
    arr.map(&:attributes)
    end
    end
    end
    end

    然后,您可以透明地序列化和反序列化 education 模型中的 User 数组:
    class User
    # ...
    serialize :education, Education::ArraySerializer
    # ...
    end

    此解决方案应允许您使用内置 Rails 验证器验证 Education 对象的各个属性,将它们嵌入到嵌套表单中,等等。

    重要提示: 我写了上面的代码没有测试它,所以它可能需要一些修改。

    关于ruby-on-rails - 使用 RubyOnRails 验证 jsonb 对象数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45037531/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com