如何在Rails中验证对象的jsonb数组?

时间:2019-07-29 21:05:15

标签: ruby-on-rails postgresql activerecord

我有一个名为Order的模型,我想向其中添加一个名为jsonb的新status_updates列。此列将包含以下格式的数据:

status_updates = [{ status: 'success', created_at: <timestamp> }, { status: 'processing', created_at: <timestamp> }]

我想验证每个status元素的status_updates属性是以下之一:successcanceledprocessing。另外,我想验证每个元素都有一个created_at时间戳。

您将如何在Rails中做到这一点?是否可以对状态进行类似于enum的操作?

1 个答案:

答案 0 :(得分:3)

我想如果我是你,我可能会考虑创建一个OrderStatus模型,例如:

# == Schema Information
#
# Table name: order_statuses
#
#  id               :bigint           not null, primary key
#  status           :integer          default(0)
#  order_id         :integer
#  created_at       :datetime         not null
#  updated_at       :datetime         not null
#
class OrderStatus < ApplicationRecord
  belongs_to :order
  validates :status, 
            presence: true,
            inclusion: { in: 0..2 }

  enum status: {
    processing:     0,
    success:        1,
    cancelled:      2,
  }

end

然后在Order中,执行以下操作:

class Order < ApplicationRecord
  has_many :order_statuses 
end

现在,每条OrderStatus记录都会有一个created_at值(假设您的OrderStatus有效并已保存)。并且,status将被验证为enum中的值之一。按照书面规定,status将默认为processing-您可能想要也可能不需要。