Ruby on rails 在rails datagrid Gem中修改@grid.assets
我有一个非常精细的ACL。我无法扩展网格类来使用我的模块,因此我认为我在控制器级别强制使用ACL(访问列表) 基本上在sales_reports_controller.rb我有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
@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