在Rails JSON响应中包含嵌套对象/与过滤器的关系

时间:2016-12-23 06:55:05

标签: ruby-on-rails json

有人可以提供一些建议,说明在要过滤的JSON响应中包含嵌套对象/关系的“最佳”方法是什么?

在下面的简单示例中,假设模型Comment有一个软删除标记is_deleted = true,我想只包含is_deleted = false的注释。实现这一目标的最佳方法是什么?

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

2 个答案:

答案 0 :(得分:1)

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

has_many :comments, -> { is_deleted: false }

这将仅返回那些未删除的注释。然后,您现有的JSON代码将正常工作。

修改1:

此解决方案符合我们在评论中的讨论。

Post中创建便捷方法。这将返回所有未删除的注释。

def visible_comments
  comments.where(is_deleted: false)
end

然后,您可以按如下方式更改渲染方法:

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

这将调用visible_comments的{​​{1}}方法,并且仅包含该方法返回的结果。

答案 1 :(得分:0)

编辑你的模态

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

您只能添加评论和发布字段:[.....]您想要包含在回复中

posts = Post.all
render json: posts