6

Tôi thấy rằng khi tôi sử dụng ActiveModel Serializers để tạo JSON cho một tập hợp các mô hình bao gồm các liên kết, kết quả là một tấn truy vấn SQL (một cho mỗi liên kết). Làm thế nào tôi có thể tránh điều này?Làm thế nào để tránh nhiều cuộc gọi SQL trong ActiveModel Serializers?

Tôi đã cố gắng để làm một bao gồm trong bộ điều khiển:

render json: Project.includes(tasks: [:workers]) 

Nhưng điều này dường như không làm việc. Ngay cả khi tôi vượt qua các mối quan hệ (với bao gồm) trực tiếp đến ArraySerializer nó không giúp đỡ.

+0

Nếu bạn có thể gửi toàn bộ khối respond_to của bạn, và nội dung kết quả của đăng nhập của bạn, đó sẽ là hữu ích. – mysmallidea

Trả lời

-1

Tôi đã chuyển sang rabl. chi tiết hơn và kiểm soát tốt hơn

0

Hãy thử instantiating một serializer mình:

@projects = Project.includes(tasks: [:workers]) 
render json: ActiveModel::ArraySerializer.new(@projects, each_serializer: ProjectSerializer).to_json 
1

Nó là một chút cực đoan nhưng đối với các truy vấn phức tạp mà đã bị đánh rất nhiều tôi chuyển toàn bộ hệ JSON vào truy vấn cơ sở dữ liệu (Tôi đang sử dụng Postgres 9.3 hỗ trợ). Nó có lẽ không phải là giải pháp sạch nhất vì nó cần SQL khá thô nhưng nó là nhanh.

Tôi sẽ cập nhật ví dụ nếu có ai quan tâm.

0

Tôi tìm thấy việc sử dụng các bộ điều khiển trong bộ điều khiển đã làm việc cho tôi nhưng bạn phải cẩn thận rằng đối tượng serializer của bạn không bao gồm các mối quan hệ không có trong phần bao gồm.

Ngoài ra tôi tìm thấy nếu bạn chỉ định một one-to-one mối quan hệ như

has_one :country, embed: :ids, include: false 

nó sẽ lấy các đối tượng khác mặc dù nó không cần. Thay vào đó tôi đã thay thế nó bằng:

attributes :country_id 

Tôi đang sử dụng Active Mẫu Serializer v0.8.3

Các vấn đề liên quan