【问题标题】:Include nested objects/relations with filter in Rails JSON response在 Rails JSON 响应中包含带有过滤器的嵌套对象/关系
【发布时间】:2016-12-23 06:55:05
【问题描述】:

任何人都可以就在您想要过滤的 JSON 响应中包含嵌套对象/关系的“最佳”方式提供一些建议吗?

在下面的简单示例中,假设模型 Comment 具有软删除标志 is_deleted = true,我只想包含具有 is_deleted = false 的 cmets。完成此任务的最佳方法是什么?

posts = Post.all
render json: posts.to_json(:include => [:comments])

【问题讨论】:

    标签: ruby-on-rails json


    【解决方案1】:

    我可以想出一个简单的解决方案。在Post 中,您可以将已删除的 cmets 从结果中限定出来,如下所示:

    has_many :comments, -> { is_deleted: false }
    

    这将只返回那些没有被删除的 cmets。然后,您现有的 JSON 代码就可以正常工作了。

    编辑 1:

    此解决方案根据我们在 cmets 中的讨论。

    Post 中创建一个便捷方法。这将返回所有未被删除的 cmets。

    def visible_comments
      comments.where(is_deleted: false)
    end
    

    然后,你可以改变你的渲染方法如下:

    render json: posts.to_json(:include => [:visible_comments])
    

    这将调用Postvisible_comments 方法,并将仅包含该方法返回的结果。

    【讨论】:

    • 感谢您的回答。我确实尝试过这个,但我们也不希望该范围一直适用,因为我们确实会向我们的“管理员”显示已删除的 cmets。
    • 在这种情况下,您可以创建自定义范围,例如scope :visible_comments, -> { comments.where(is_deleted: false) },并将此范围包含在您的 JSON 渲染中。
    • 你知道包含自定义范围的语法是什么吗?
    • @TimS -- 我的错!您不需要创建自定义范围。一种方便的方法可以解决问题。请参阅我的更新答案。
    • 那行得通,-非常感谢!我不认为有一种方法可以重命名或别名方便方法吗?我找不到任何东西,但是像 :include => [:visible_comments as :comments] 之类的东西?
    【解决方案2】:

    编辑你的模态

    class Post < ActiveRecord::Base  
    
       def as_json(_options = {})
        super only: [:id, :title],
              include: {
                comments: {
                  only: [:id, :comment_fieds]
                }
       end
    end
    
    
    class Comment < ActiveRecord::Base
      default_scope { where is_deleted: false }
    end
    

    您只能在以下内容中添加 cmets 和 post 字段:[.....] 您希望在响应中包含的内容

    posts = Post.all
    render json: posts
    

    【讨论】:

    • 感谢您的回答。我确实尝试过这个,但我们也不希望该范围一直适用,因为我们确实会向我们的“管理员”显示已删除的 cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多