有人可以提供一些建议,说明在要过滤的JSON响应中包含嵌套对象/关系的“最佳”方法是什么?
在下面的简单示例中,假设模型Comment
有一个软删除标记is_deleted = true
,我想只包含is_deleted = false
的注释。实现这一目标的最佳方法是什么?
posts = Post.all
render json: posts.to_json(:include => [:comments])
答案 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