私人职位的范围

时间:2016-04-15 07:41:30

标签: ruby-on-rails ruby scope

所以我有一个简单的范围:

scope :visible_to, -> (user) {user && (user.premium? || user.admin?) ? all : where(:private => false || nil) }

这个想法是,如果用户角色等于PremiumAdmin,它会显示(在索引上)私人和公开帖子的列表。当我以管理员或高级版登录时,似乎工作正常。但是,如果我没有以Standard用户身份登录或登录(默认角色),则仅显示零帖子。如何使其适用于标准用户和访客用户?

3 个答案:

答案 0 :(得分:1)

试试这个

scope :visible_to, -> (user) {(user && (user.premium? || user.admin?)) ? all : where(:private => [false,nil]) }

答案 1 :(得分:1)

如果我理解正确,你想展示

的帖子
  • 当没有用户或用户既不是管理员也不是高级用户时,private设置为falsenil
  • 如果用户是管理员或高级版,则显示所有帖子

所以你可以试试这个:

class Post
  scope :visible_to, -> (user) do
    return all if user && (user.premium? || user.admin?)
    where(private: [false, nil])
   end
end

一些建议/想法:

  • 确保private为真或假,不允许为零。将简化所有查询
  • 重命名private属性。它可能会与ruby本身的private关键词混淆

检查它的另一种方法有点另一种方式。在admin / premium:

时,始终显示falsenil并添加true
class Post 
  scope :visible_to, ->(user) do
    values = [false, nil]
    values << true if (user.try!(:premium?) user.try!(:admin?))
    where(private: values)
  end
end

答案 2 :(得分:0)

这样Users.visible_to将返回高级用户和管理员用户。

scope :visible_to, -> (user) do
  where(users.premium? = ? OR users.admin? = ?, true, true)
end