2016-04-15 137 views
0

所以我有一个简单的范围:范围为私人职位

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

的想法是,它显示了(对指数)私人和公共职位的名单,如果用户角色等于PremiumAdmin。当我以管理员或高级身份登录时,似乎正常工作。但是如果我没有登录或以Standard用户(默认角色)登录,则只显示无帖子。我如何才能使它适用于标准用户和访客用户?

回答

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属性。它可能会混淆与private关键字的红宝石本身

另一种检查它的方式有点另一种方式。总是显示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 
+0

你是正确的,它的工作非常感谢你。几个帖子因私人而无效的原因是因为它们来自我没有指定真或假的种子数据。对不起:( –

+0

你可以在数据库中指定一个默认值,或者在播种时将nil转换为false,这将简化你的代码。 –

0

这种方式Users.visible_to将返回溢价和管理员用户。

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

试试这个

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