Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 允许在id不为零时访问cancan/cancan_Ruby On Rails_Ruby_Cancan - Fatal编程技术网

Ruby on rails 允许在id不为零时访问cancan/cancan

Ruby on rails 允许在id不为零时访问cancan/cancan,ruby-on-rails,ruby,cancan,Ruby On Rails,Ruby,Cancan,我正在尝试使用cancan访问存在关联的位置 它需要同时处理对象属性和可通过选择访问的对象,这样我就不能使用块,除非有人告诉我在这样做时如何避开错误 我想出了一个残忍的办法 lead.rb has_many :recordings has_many :emails ability.rb can :manage, Lead can :manage, Recording, :lead_id => (1..Lead.pluck(:id).max).to_a can :manage, Emai

我正在尝试使用cancan访问存在关联的位置

它需要同时处理对象属性和可通过选择访问的对象,这样我就不能使用块,除非有人告诉我在这样做时如何避开错误

我想出了一个残忍的办法

lead.rb
has_many :recordings
has_many :emails

ability.rb

can :manage, Lead
can :manage, Recording, :lead_id => (1..Lead.pluck(:id).max).to_a
can :manage, Email, :lead_id => (1..Lead.pluck(:id).max).to_a
我的意思是lead_id不为空

我有没有办法做到这一点,而不必每次创建100000个项目数组


额外信息:值得注意的是,这些并不是录制和电子邮件模型上的唯一控件,因此我可以添加额外权限,而不是重新设置并负面表示它们,这一点很重要。

有两种方法可以实现这一点:

1.各种能力的组合 这是最新的。使用这个,除非你有充分的理由不这样做

这里的想法是将can与can结合起来:

请注意,此处的规则是正确的,因此规则重写是正确的

2.能力块 通过,您可以形成更复杂的查询

一个简单的实现方法如下:

can :manage, Recording do |recording|
  !recording.lead_id.nil?
end
但是,为了将此功能与其他功能结合起来,还必须在获取记录时使用此功能。此附加SQL控制加载资源操作,例如索引:

<>为了保持这个逻辑干涸,你也可以考虑在一个块中定义你的权限,例如:

[Recording, Email].each do |model|
  can :manage, model
  cannot :manage, model, lead_id: nil
end

有两种方法可以实现这一点:

1.各种能力的组合 这是最新的。使用这个,除非你有充分的理由不这样做

这里的想法是将can与can结合起来:

请注意,此处的规则是正确的,因此规则重写是正确的

2.能力块 通过,您可以形成更复杂的查询

一个简单的实现方法如下:

can :manage, Recording do |recording|
  !recording.lead_id.nil?
end
但是,为了将此功能与其他功能结合起来,还必须在获取记录时使用此功能。此附加SQL控制加载资源操作,例如索引:

<>为了保持这个逻辑干涸,你也可以考虑在一个块中定义你的权限,例如:

[Recording, Email].each do |model|
  can :manage, model
  cannot :manage, model, lead_id: nil
end

我有这个需要,这里有一个可能更快的解决方案。您不必点击数据库,也没有理由将范围更改为数组,因为检查范围工作正常我不确定这是否在库中内部使用范围,但理想情况下它会

can :manage, [Recording, Email], :lead_id => (1..(2**31-1))

我正在使用cancancan。

我有这个需要,这里有一个可能更快的解决方案。您不必点击数据库,也没有理由将范围更改为数组,因为检查范围工作正常我不确定这是否在库中内部使用范围,但理想情况下它会

can :manage, [Recording, Email], :lead_id => (1..(2**31-1))

我正在使用cancancan。

生成数组的复杂方法有什么意义?为什么不直接使用lead\u id:lead.ids?生成数组的复杂方法有什么意义?为什么不仅仅是lead_id:lead.id?是的,那很好,除了还有其他更复杂的事情。只有当您愿意擦除所有其他权限时,此方法才有效。澄清一下,在其他情况下,我是基于一个id来指定权限的,如果我试图将其反向表示为否定的,我需要这样做以匹配上述内容,我最终会遇到完全相同的问题…我不能用一个块来定义它,如前所述,因为这只支持对象属性,而不是通过索引操作(这是我主要需要的)来使用可访问的\u。只有当您愿意擦除所有其他权限时,此方法才有效-是,不幸的是,这是CanCan的主要问题/批评之一,也是为什么许多开发人员现在更喜欢使用其他方法,例如。如果您的许可仅适用于某些lead_ID,那么据我所知,用1000个id定义一个列表的问题是不可避免的,除非您可以查询模型的其他属性,而不是id。但是,您至少可以缓存id列表以提高性能。嗨,Tom,在这种情况下,任何id都可以。我只想限制零值。是的,那很好,除了还有其他更复杂的事情。只有当您愿意擦除所有其他权限时,此方法才有效。澄清一下,在其他情况下,我是基于一个id来指定权限的,如果我试图将其反向表示为否定的,我需要这样做以匹配上述内容,我最终会遇到完全相同的问题…我不能用一个块来定义它,如前所述,因为这只支持对象属性,而不是通过索引操作(这是我主要需要的)来使用可访问的\u。只有当您愿意擦除所有其他权限时,此方法才有效-是,不幸的是,这是CanCan的主要问题/批评之一,这也是为什么许多开发人员现在更喜欢使用其他方法,例如。如果您的许可仅适用于某些lead_ID,那么据我所知
定义一个包含1000个id的列表是不可避免的-除非您可以查询模型的其他属性,而不是id。但是,您至少可以缓存id列表以提高性能。嗨,Tom,在这种情况下,任何id都可以。我只想限制零值。