Tôi sẽ viết quá trình di chuyển theo cách này:
def change
reversible do |dir|
dir.up { change_column :models, :attribute, 'jsonb USING CAST(attribute AS jsonb)' }
dir.down { change_column :models, :attribute, 'json USING CAST(attribute AS json)' }
end
end
Tôi không biết làm thế nào điều này so sánh hiệu suất khôn ngoan với các giải pháp khác, nhưng tôi đã thử nghiệm điều này trên một bảng có 120.000 bản ghi, mỗi bản ghi có bốn json
và tôi mất khoảng một phút để di chuyển bảng đó. Tất nhiên, tôi đoán nó phụ thuộc vào mức độ phức tạp của json
cấu trúc là.
Ngoài ra, hãy lưu ý rằng nếu các bản ghi hiện có của bạn có giá trị mặc định là {}
, bạn phải thêm vào các câu lệnh trên default: {}
, bởi vì nếu không, bạn sẽ có jsonb
nhưng giá trị mặc định sẽ vẫn là '{}'::json
.