Ruby on rails rails中有条件默认作用域吗?

Ruby on rails rails中有条件默认作用域吗?,ruby-on-rails,ruby,default-scope,Ruby On Rails,Ruby,Default Scope,我使用的是rails 3.2.21,ruby版本是2.0 我的要求是为特定模型提供基于角色的条件缺省范围。乙二醇 将角色变量视为登录用户的属性 if role == 'xyz' default_scope where(is_active: false) elsif role == 'abc' default_scope where(is_active: true) end 编程中没有什么是不可能的 使用default\u scope通常是个坏主意(很多文章都是关于这个主题的) 如果您

我使用的是rails 3.2.21,ruby版本是2.0

我的要求是为特定模型提供基于角色的条件缺省范围。乙二醇

将角色变量视为登录用户的属性

if role == 'xyz'
  default_scope where(is_active: false)
elsif role == 'abc'
   default_scope where(is_active: true)
end

编程中没有什么是不可能的

使用
default\u scope
通常是个坏主意(很多文章都是关于这个主题的)

如果您坚持使用当前用户的atribute,您可以将其作为参数传递给scope:

scope :based_on_role, lambda { |role|
  if role == 'xyz'
    where(is_active: false)
  elsif role == 'abc'
    where(is_active: true)
  end
}
然后按如下方式使用:

Model.based_on_role(current_user.role)

旁注:Rails 3.2.x-严重吗?..

编程中没有什么是不可能的

default_scope where(
  case role
  when 'xyz' then { is_active: false }
  when 'abc' then { is_active: true }
  else '1 = 1'
  end
)
使用
default\u scope
通常是个坏主意(很多文章都是关于这个主题的)

如果您坚持使用当前用户的atribute,您可以将其作为参数传递给scope:

scope :based_on_role, lambda { |role|
  if role == 'xyz'
    where(is_active: false)
  elsif role == 'abc'
    where(is_active: true)
  end
}
然后按如下方式使用:

Model.based_on_role(current_user.role)
旁注:Rails 3.2.x-严重吗

default_scope where(
  case role
  when 'xyz' then { is_active: false }
  when 'abc' then { is_active: true }
  else '1 = 1'
  end
)
另外,请阅读Andrey Deineko的回答,特别是关于默认作用域用法的部分



也请阅读Andrey Deineko的答案,特别是关于默认作用域使用的部分。

角色是类变量或什么?将角色视为登录用户的属性,它看起来是非常糟糕的模式。那么像CanCan这样的gems呢?使用一个作用域,而不是它,并向它传递一个角色参数。Ruby on Rails在2016年6月30日发布时达到了其生命周期的终点。更新到一个维护版本(4.2。x或5。x)是高度推荐的。角色是类变量还是什么?考虑角色作为登录用户的属性,它看起来是非常糟糕的模式。那么像CanCan这样的gems呢?使用一个作用域,而不是它,并向它传递一个角色参数。Ruby on Rails在2016年6月30日发布时达到了其生命周期的终点。强烈推荐更新到一个维护版本(4.2 x或5。x)。考虑使用<代码> CASE角色<代码>凌乱<代码> > s pasgHTTY。顺便说一句,您在
elsif
@mudasobwa-yep中有一个输入错误,考虑了
案例角色
,但只是复制了作者在OP中的内容。此外,动态评估的
lambda
与OP的静态实现不同。决定按照Andrey的建议使用范围。是的,在Rails 3.2 .x上,它是一个遗留的应用程序,移植到Rails的新版本的成本很高,但是它在流水线中。另外一个是“在编程中没有什么是不可能的”。我总是告诉我的客户。考虑使用<代码> CASE角色<代码>凌乱<代码> > < /COD> S pAgHTTY。顺便说一句,您在
elsif
@mudasobwa-yep中有一个输入错误,考虑了
案例角色
,但只是复制了作者在OP中的内容。此外,动态评估的
lambda
与OP的静态实现不同。决定按照Andrey的建议使用范围。是的,在Rails 3.2.x上,它是一个遗留应用程序,迁移到Rails新版本的成本很高,但它正在准备中。另外一个是“编程中没有什么是不可能的”。我一直告诉我的客户这一点。我想它只会再次抛出模型的
未定义变量或方法“role”
,正如我在对你的回答的评论中所说的,静态子句和动态子句之间有着显著的区别。这一个是静态的,它在模型的上下文中被评估过一次。我认为它将再次抛出模型的
未定义变量或方法“role”,正如我在对您的答案的评论中所说的,静态子句和动态子句之间存在着显著的差异。这个是静态的,它在模型的上下文中被评估一次。