为 rails 中的哈希参数数组编写验证

Writing validations for an array of hashes parameter in rails

我有一个新的 API 属性,它是一个散列数组,我想将其作为内置 rails 验证的一部分进行验证。由于这是一个复杂的对象,我正在验证我没有找到任何有效的例子来参考。

参数名称是 books,它是一个散列数组,每个散列具有三个属性 genre 应该是三个可能值的枚举,authors 应该是一个整数数组和 bookId 应该是一个整数。

像这本书:[{bookId: 4, genre: "crime", authors: [2, 3, 4]}]

如果它类似于数组,我可以在此处查看它的文档 https://guides.rubyonrails.org/active_record_validations.html,但我没有找到上述情况的任何示例。

我正在使用 rails 4.2.1 和 ruby 2.3.7 如果你能帮助我从某个地方开始,那就太好了。

具体来说,枚举验证我在这里找到了一个很好的答案How do I validate members of an array field?。问题是当我需要在哈希数组中使用它时。

你可以自己写一个简单的custom validation method。这样的事情可能是一个好的开始:

validate :format_of_books_array

def format_of_books_array
  unless books.is_a?(Array) && books.all? { |b| b.is_a?(Hash) }
    errors.add(:books, "is not an array of hashes") 
    return
  end

  errors.add(:books, "not all bookIds are integers")  unless books.all? { |b| b[:bookId].is_a?(Integer) }
  errors.add(:books, "includes invalid genres")       unless books.all? { |b| b[:genre].in?(%w[crime romance thriller fantasy]) }
  errors.add(:books, "includes invalid author array") unless books.all? { |b| b[:authors].is_a?(Array) && b[:authors].all? { |a| a.is_a?(Integer) } }
end