如何创建条件和可链接的查询方法

时间:2015-10-28 12:31:43

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我有三个模型:PostCommentUser

评论帖子时,用户可以选择“仅针对帖子作者显示”,Comment属性public获得false值。

该方法只应返回私人评论,如果它们属于current_user,或者是作为查询作者的帖子。

我如何构建条件exclude_unauthorized_privates方法以及它应该采用哪种模型?

post.ordered_comments.exclude_unauthorized_privates

2 个答案:

答案 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上的评论。