Tôi đang gặp sự cố khi tôi đang làm việc với phương pháp as_json và cách trả lại hiệu quả đối tượng trong JSON AND nó cũng thuộc đối tượng dưới dạng JSON, trong đó đối tượng depends_to có đối tượng is_to riêng. Mã có lẽ sẽ giải thích nó tốt hơn.Rails as_json issue - Cách bao gồm các đối tượng lồng nhau hiệu quả?
Các Not-Working Way
Alert lớp
class Alert < ActiveRecord::Base
belongs_to :message
# for json rendering
def as_json(options={})
super(:include => :message)
end
end
nhắn lớp
def as_json(options={})
super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names],
include: { camera: { only: [:id, :name] },
position: { only: [:id, :name, :address, :default_threat_level ]},
images: { only: [:id, :photo_url, :is_hidden]} })
end
Vấn đề này lần đầu tiên được thành lập là khi tôi có một đối tượng Alert và gọi
alert.as_json()
tôi nhận được tất cả các thuộc tính từ Alert và tất cả các thuộc tính từ tin nhắn, nhưng không ai trong số các thuộc tính khác từ tin nhắn mà tôi muốn, như Camera, Chức vụ, vv
Đây là "Đó là làm việc, nhưng có lẽ không đúng thiết kế Way"
Alert Lớp
class Alert < ActiveRecord::Base
belongs_to :message
# for json rendering
def as_json(options={})
super().merge(:message => message.as_json)
end
end
Tin nhắn Lớp
# for json rendering
def as_json(options={})
super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names])
.merge(:camera => camera.as_json)
.merge(:position => position.as_json)
.merge(:images => images.as_json)
end
Trong thiết lập thứ 2 này, tôi nhận được tất cả thuộc tính lồng nhau của Tin nhắn như tôi muốn.
Câu hỏi của tôi, tôi có bỏ lỡ một số Công ước Rails để làm điều này đúng không? Nó có vẻ như sẽ có/nên là một cách dễ dàng hơn.
Có vẻ như họ đã sửa nó bằng yêu cầu kéo, nhưng không bao giờ kéo nó vào một phiên bản.Cảm ơn bạn đã liên kết, nó đã xóa một vài vấn đề. – bluedevil2k
Đối với hồ sơ, những gì tôi nhận được từ PR đó là: 1) cố gắng sử dụng một viên ngọc cụ thể cho json json (Tôi thích Active Model Serializers) 2) Nếu bạn không muốn/không thể làm điều đó, ghi đè lên 'serialized_hash 'thay vì' as_json' trong tất cả các mô hình của bạn. Chỉ cần thay thế 'as_json' bằng' serialized_hash'. Mô hình của bạn sẽ hiển thị chính xác các phụ thuộc được bao gồm. – kikito
cảm ơn kikito, chỉnh sửa nhỏ, đó là 'serializable_hash' – trans1t