我有三个模型:Post
,Comment
和User
。
评论帖子时,用户可以选择“仅针对帖子作者显示”,Comment
属性public
获得false
值。
该方法只应返回私人评论,如果它们属于current_user
,或者是作为查询作者的帖子。
我如何构建条件exclude_unauthorized_privates
方法以及它应该采用哪种模型?
post.ordered_comments.exclude_unauthorized_privates
答案 0 :(得分:1)
首先让我说post应该只有一个方法,否则就是demeter违规。只需要帖子委托:ordered_authorized_comments即可发表评论。
我认为你应该使用arel来表示这个。我认为查询需要是“where private:true或user:[poster,commentor]”(除了正确的语法)。使用arel比使用丑陋的sql语句更容易获得OR。你当然可以选择。
答案 1 :(得分:1)
我将如何做到这一点。
在Post
模型上,我会创建一个这样的方法:
def is_author?
current_user.id == user_id
end
这样您就可以检查页面上的current_user
是否是帖子的作者。
然后在你的Comment
模型上我会添加这个范围:
scope :public, lambda { |user_id|
where("user_id = ? OR public = ?", user_id, 1)
}
然后,为了让您的控制器在页面上显示评论,我会将@comments
设置为:
@comments = post.is_author? post.ordered_comments : post.ordered_comments.public(current_user.id)
这会将@comments
变量传递给您的视图,您只会显示应显示在current_user
上的评论。