2010-12-14 42 views
19

Tôi có tình huống mô hình dữ liệu lạ để bắt đầu, vì vậy có thể toàn bộ cách tiếp cận của tôi là sai. Đây là những gì tôi đang làm:Lồng nhau ROR: bao gồm để bao gồm các tài nguyên phụ trong to_xml/to_json

Tôi có một lớp được gọi là Chim và một lớp đơn giản có tên là Màu. Khái niệm, mỗi con chim có hai to_many hiệp hội để màu sắc, một cho nam màu sắc và một cho màu sắc nữ. Cách tôi đã xử lý này là sử dụng một mô hình tham gia được gọi là BirdColoration thuộc về một con chim và một màu sắc và có một lĩnh vực boolean bổ sung để cho biết nếu màu sắc là dành cho nam hay nữ. Vì vậy, mỗi con chim thực sự có mối quan hệ to_many với BirdColoration cũng như to_many thành Color: thông qua BirdColoration. Nếu điều này nghe có vẻ hợp lý, hãy tiếp tục đọc. Nếu không, hãy dừng lại và cho tôi biết tại sao nó sai!

Tôi cần có khả năng kết xuất bảng chim như json. Trước đây, khi mỗi con chim chỉ có một to_many liên kết với màu sắc, tôi chỉ có thể sử dụng: bao gồm để bao gồm màu sắc của mỗi con chim trong bãi rác. Bây giờ, tôi đang bao gồm các BirdColorations trong bãi chứa, nhưng tôi vẫn cần phải nhận được ở các mô hình màu sắc mình. Tôi có thể bao gồm riêng màu sắc và màu sắc của từng con chim và sau đó kết hợp chúng trong khi phân tích cú pháp, nhưng tôi sẽ chỉ thay đổi màu sắc của mỗi màu một cách trực tiếp. Một cái gì đó giống như

 format.json { render :json => @birds.to_json(:include => [{:bird_colorations => :color}, :seasons, :habitats, :image_holders]) } 

Ở trên không có tác dụng, tuy nhiên. Tôi nghĩ rằng điều này là có thể. Bất cứ ai có thể chỉ cho tôi đi đúng hướng để làm thế nào để xử lý này?

Hiện tại, tôi sẽ chỉ bao gồm màu sắc và màu sắc riêng biệt của mỗi con chim và kết hợp chúng trong phân tích cú pháp. Ít nhất tôi biết rằng sẽ làm việc.

Cảm ơn!

Trả lời

51

Tôi đã tìm thấy câu trả lời here. Cú pháp cho tùy chọn: include trong to_xml và to_json khác với phương thức tìm kiếm của ActiveRecord. Để bao gồm các tài nguyên lồng nhau theo cách này, bạn chuyển vào một băm thay vì một mảng. Lời gọi phương thức chính xác cho tôi trông giống như:

 format.json { render :json => @birds.to_json(:include => {:bird_colorations => {:include => :color}, :seasons => {}, :habitats => {}, :image_holders => {}}) } 

So sánh với câu hỏi của tôi để thấy sự khác biệt. Đối với các tài nguyên mà bạn không muốn bao gồm các tài nguyên phụ, chỉ cần chuyển một giá trị băm rỗng làm giá trị cho tên biểu tượng của nó.

Trực tiếp và học hỏi!

+1

Tôi muốn bỏ phiếu nhiều hơn cho điều này !! Cảm ơn! – brutuscat

+0

tôi cũng vậy @brutuscat. Lưu thịt xông khói của tôi! – Rots

+0

Mã trong câu hỏi của bạn trông sạch sẽ hơn rất nhiều, điều này rất khó hiểu. Đặc biệt là vì nếu bạn không có màu tổ chim, ví dụ câu hỏi sẽ hoạt động. Cảm ơn đã đưa ra giải pháp của bạn. Rails nên sửa lỗi này ... – thatmiddleway

2

Nếu bạn có cấu trúc JSON phức tạp, tốt hơn là ghi đè serializable_hash hoặc as_json trong mô hình của bạn hơn là cố gắng thực hiện tất cả thông qua render :json.

Vì vậy, một cái gì đó giống như

def serializable_hash(options = nil) 
    options ||= {} 
    bird = {:name => name, ...} 
    bird[:seasons] = seasons.serilizable_hash 
    bird[:colors] = ... # whatever complex logic you want to get to the colors 
    bird 
end 

Cả hai chức năng chỉ cần trả về một băm.

+0

Cảm ơn! Tôi sẽ xem xét điều này. Nếu tôi hài lòng với đầu ra tôi nhận được từ render: json, có lý do nào khác để ghi đè lên các phương thức đó (hiệu suất, có thể) không? Tất cả những thứ khác đều bình đẳng, bản năng của tôi là để cho chức năng tích hợp xử lý mọi thứ cho tôi. – CharlieMezak

+0

Tôi không nghĩ rằng bạn sẽ nhận được tăng hiệu suất vì render json gọi as_json/serializable_hash ở chế độ nền.Nó chỉ là một triết lý thiết kế tốt được gọi là "mô hình chất béo, bộ điều khiển mỏng", được thảo luận một cách thanh lịch nhất tại đây: http://stackoverflow.com/questions/2550376/rails-skinny-controller-vs-fat-model-or-should-i- make-my-controller-anorexic – icecream

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