Ruby on rails 在rails datagrid Gem中修改@grid.assets

Ruby on rails 在rails datagrid Gem中修改@grid.assets,ruby-on-rails,ruby,datagrid,scope,Ruby On Rails,Ruby,Datagrid,Scope,我有一个非常精细的ACL。我无法扩展网格类来使用我的模块,因此我认为我在控制器级别强制使用ACL(访问列表) 基本上在sales_reports_controller.rb我有 @grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope| scope.page(params[:page]) end 我只需要显示属于具有特定角色的用户的销售。访问列表位于一个数组中,如果我可以遍历@grid.assets

我有一个非常精细的ACL。我无法扩展网格类来使用我的模块,因此我认为我在控制器级别强制使用ACL(访问列表)

基本上在sales_reports_controller.rb我有

 @grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
      scope.page(params[:page])
  end
我只需要显示属于具有特定角色的用户的销售。访问列表位于一个数组中,如果我可以遍历
@grid.assets
,那么我只能将需要的记录添加到
@grid
,并将其传递给视图

或者,当我获取
范围
并过滤记录时,是否可以执行循环

现在我是否可以做类似的事情:

 aa = @grid.assets
      grid = []
      aa.each do |a|
        if user_acls.include?(a.access_list_id)
          grid.push a
        end
      end
 @grid.assets = grid
上面的循环不起作用,因为资产不会接受任何东西。我得到以下错误

undefined method 'assets=' for #<SalesReportsGrid:0x007fe9e79203a0>
我不知道怎么做

谢谢

编辑:(可能的解决方案) 我添加了

a = []
   assets.each do |asset|
    if user_acls.include?(asset.access_list_id)
      a.push asset
    end
   end
   assets = a
在视图级别,它可以工作(部分复制)。
不过,最好在控制器级别应用限制

您不需要将资源传递回网格

在控制器中执行以下操作:

@assets = @grid.assets.select do |a|
  user_acls.include?(asset.access_list_id)
end.page(params[:page])
并在模板引擎中按以下方式呈现资源:

datagrid_table(@grid, @assets)
通常,在ruby级别过滤ACL会导致严重的性能问题。只有当您确信
@grid.assets
永远不会超过1000时,才能使用它

如果您能够将其移动到SQL,请执行以下操作:

@grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
  scope.where(access_list_id: user_acls).page(params[:page])
end

完美的我移动SQL。我不得不改变我的整个销售数据库结构。但这是值得的。我还有一个问题,我在stackoverflow中提出了一个新问题,我会让你知道的。再次感谢你,伙计。
@grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
  scope.where(access_list_id: user_acls).page(params[:page])
end