【问题标题】:ActiveRecord to_json specifying options for included methodsActiveRecord to_json 指定包含方法的选项
【发布时间】:2012-10-16 17:05:20
【问题描述】:

在我看来,我有以下 to_json: <%=raw @forums.to_json(:methods => [:topic_count, :last_post]) %>;

在模型中我有以下方法:

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 包含与 ForumTopic (belongs_to :forum_topic) 的关系,我想在我的 json 中包含这个 ForumTopic,所以我最终得到 {..., "last_post":{..., "forum_topic":{ ...}...},...}。我怎样才能做到这一点?

【问题讨论】:

    标签: ruby ruby-on-rails-3 activerecord ruby-on-rails-3.2


    【解决方案1】:

    通常最好在模型中保留这种声明。您可以覆盖模型中的 as_json 方法。这种方法允许您控制整个对象图的序列化行为,并且您可以为这些东西编写单元测试。

    在这个例子中,我猜你的 @forums 变量引用了一个名为 Forum 的模型,如果我错了,希望你仍然明白这一点。

    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
    

    【讨论】:

    • 我想把它排除在模型之外的原因是因为不是每次我使用 to_json 时我都想包含所有这些数据。在此示例中,我特别包含了如此多的数据,因为打印的 json 用于引导主干集合。 ForumPost 和 Forum 在除此视图之外的其他地方转换为 json,我真的不希望它们每次都包含此数据。
    • 你可能想看看 jose valim 的活动模型序列化器github.com/josevalim/active_model_serializers 我还没有使用它,但它看起来是为不同目的管理不同类型的序列化的正确方法。为 to_json 或 as_json 创建这些疯狂的选项哈希真的很可怕,这似乎是一个好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多