2015-09-29 14 views
5

Tôi đang sử dụng JSONAPI format cùng với Active Model Serializers để tạo api bằng rails-api.Làm cách nào để chọn thuộc tính tôi muốn cho mối quan hệ serializers mô hình đang hoạt động

Tôi có bộ nối tiếp hiển thị post cụ thể có nhiều topics và hiện tại, trong các mối quan hệ, liệt kê các chủ đề đó. Nó hiện chỉ liệt kê id và loại. Tôi cũng muốn hiển thị tiêu đề của chủ đề.

Một số sẽ nói sử dụng include: 'topics' trong bộ điều khiển của tôi, nhưng tôi không cần bản ghi chủ đề đầy đủ, chỉ tiêu đề của nó.

Câu hỏi: Làm cách nào để chỉ định thuộc tính nào tôi muốn hiển thị từ chủ đề?

Những gì tôi có

"data": { 
    "id": "26", 
    "type": "posts", 
    "attributes": { 
    "title": "Test Title 11" 
    }, 
    "relationships": { 
    "topics": { 
     "data": [ 
     { 
      "id": "1", 
      "type": "topics" 
     } 
     ] 
    } 
    } 
} 

Những gì tôi muốn

"data": { 
    "id": "26", 
    "type": "posts", 
    "attributes": { 
    "title": "Test Title 11" 
    }, 
    "relationships": { 
    "topics": { 
     "data": [ 
     { 
      "id": "1", 
      "type": "topics", 
      "title": "Topic Title" 
     } 
     ] 
    } 
    } 
} 

lớp serializer hiện tại của tôi EDIT: đây là những gì tôi là sau khi xin vui lòng.

class PostSerializer < ActiveModel::Serializer 
    attributes :title 

    belongs_to :domain 
    belongs_to :user 

    has_many :topics, serializer: TopicSerializer 

    def topics 
    # THIS IS WHAT I AM REALLY ASKING FOR 
    end 
end 

class TopicSerializer < ActiveModel::Serializer 
    attributes :title, :description 

    belongs_to :parent 
    has_many :children 
end 

Một điều tôi cố gắng - có một câu trả lời dưới đây mà làm công việc này, nhưng nó không thực sự những gì tôi sau đó.

class PostSerializer < ActiveModel::Serializer 
    attributes :title, :topics 

    belongs_to :domain 
    belongs_to :user 

    def topics 
    # THIS WAS ANSWERED BELOW! THANK YOU 
    end 
end 

Trả lời

5

Chỉ cần chắc chắn để trả lại một băm hoặc mảng băm như vậy:

def videos 
    object.listing_videos.collect do |lv| 
     { 
     id: lv.video.id, 
     name: lv.video.name, 
     wistia_id: lv.video.wistia_id, 
     duration: lv.video.duration, 
     wistia_hashed_id: lv.video.wistia_hashed_id, 
     description: lv.video.description, 
     thumbnail: lv.video.thumbnail 
     } 
    end 
    end 
+0

Cảm ơn bạn! Điều đó hiệu quả. – alassiter

+0

Tôi upvoted câu trả lời này b/c nó đã trả lời một trong những vấn đề tôi trình bày. Tôi không có ý định nhầm lẫn câu hỏi này, nhưng sau khi lại gặp vấn đề tương tự, tôi nhận ra tôi không rõ ràng. Tôi không chắc chắn nghi thức về điều này, vì vậy hãy tha thứ cho tôi. Câu hỏi đặt ra là để xác định các thuộc tính về mối quan hệ, xem .. "Những gì tôi muốn" và câu trả lời ở đây mở rộng trên một trong những điều tôi đã thử. Nó hoạt động, nhưng những gì tôi thực sự muốn là khác nhau. – alassiter

+0

Tôi không thấy một ví dụ điển hình về điều này trong tài liệu nên tôi sẽ nói rằng nó không được hỗ trợ hoặc không hoạt động theo cách bạn muốn. Dường như chức năng ghi đè một liên kết nhằm thay đổi phạm vi chứ không phải các thuộc tính. xem tại đây https://github.com/rails-api/active_model_serializers#user-content-overriding-association-methods. Nếu bạn không bao gồm hoặc tải các dữ liệu liên quan trong bộ điều khiển wont nó gây ra một N + 1 trong serializer sau đó? Nếu bạn đang sử dụng postgres, bạn có thể trả về JSON từ db hoặc xoa bóp dữ liệu trong SQL và có một serializer tùy chỉnh. – penner

0

Thay vì xác định chủ đề phương pháp, nó tốt hơn để xác định riêng biệt serializer chủ đề với cách xác định một cách rõ ràng mà các thuộc tính bạn cần bao gồm. Đây là phương pháp tiếp cận sạch hơn và dễ bảo trì hơn, sau đó xác định phương pháp chủ đề.

class PostSerializer < ActiveModel::Serializer 
    attributes :title 

    belongs_to :domain 
    belongs_to :user 
    # remember to declare TopicSerializer class before you use it 
    class TopicSerializer < ActiveModel::Serializer 
    # explicitly tell here which attributes you need from 'topics' 
    attributes :title 
    end 
    has_many :topics, serializer: TopicSerializer 
end 

Một lần nữa, cố gắng tránh phương pháp xác định mối quan hệ nhiều nhất có thể, không sạch sẽ, không thể bảo trì.

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