2012-10-16 132 views
1

我有以下to_json在我看來選項: <%=raw @forums.to_json(:methods => [:topic_count, :last_post]) %>;ActiveRecord的to_json指定爲包括方法

,並在模型中我有以下方法:

def last_post 
    post = ForumPost.joins(:forum_topic).where(:forum_topics => {:forum_id => self.id}).order("forum_posts.created_at DESC").first 
    return post 
end 

然而ForumPost包含與論壇主題(belongs_to :forum_topic)的關係,我想在我的json中包含這個ForumTopic,所以我最終得到{...,「last_post」:{...,「forum_topic」:{...} ...}, ...}。我怎樣才能做到這一點?

回答

1

通常最好在模型中保留這種聲明。您可以覆蓋模型中的as_json方法。這種方法允許你控制整個對象圖的序列化行爲,你可以爲這些東西編寫單元測試。

在這個例子中,我猜你的@forums變量是指稱爲論壇的模型,如果我錯了,希望你仍然可以得到這個想法。

class Forum 
    ... 
    def as_json(options={}) 
     super(methods: [:topic_count, :last_post]) 
    end 
end 
class ForumPost 
    ... 
    def as_json(options={}) 
     super(methods: [:forum_topic]) 
    end 
end 
+0

原因我想保持它的模型是因爲不是每次我使用to_json我想包括所有這些數據。在這個例子中,我特別包含了太多的數據,因爲打印出的json被用來引導骨幹網絡。 ForumPost和Forum除了這個視圖外,其他地方都轉換成json,我不想每次都包含這些數據。 – Tomdarkness

+0

你可能想看看jose valim的活動模型序列化器https://github.com/josevalim/active_model_serializers我還沒有使用它,但它看起來像管理不同目的的不同類型的serilization的正確方法。爲to_json或as_json創建這些瘋狂的選項非常可怕,這似乎是一個好方法。 – joshuacronemeyer