【问题标题】:Modifying the @grid.assets in rails datagrid Gem修改 rails datagrid Gem 中的 @grid.assets
【发布时间】:2014-08-08 03:10:29
【问题描述】:

我有一个非常精细的 ACL。我无法扩展 Grid 类以使用我的模块,所以我认为我在控制器级别强加了 ACL(访问列表)。

基本上在 sales_reports_controller.rb 我有

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

我只需要显示属于具有特定角色的用户的销售额。访问列表在一个数组中,如果我可以通过@grid.assets,那么我只能将记录添加到我需要的@grid 并将其传递给视图。

或者,如果我可以在获取scope 时执行循环并过滤记录。

现在我可以做这样或类似的事情吗:

 aa = @grid.assets
      grid = []
      aa.each do |a|
        if user_acls.include?(a.access_list_id)
          grid.push a
        end
      end
 @grid.assets = grid

上面的循环不会起作用,因为 assets 不会接受任何东西。我收到以下错误。

undefined method 'assets=' for #<SalesReportsGrid:0x007fe9e79203a0>

所以我最好的选择是在此处添加循环

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

我不知道怎么做。

谢谢。

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

a = []
   assets.each do |asset|
    if user_acls.include?(asset.access_list_id)
      a.push asset
    end
   end
   assets = a

在视图级别,它可以工作(部分副本)。 不过,最好在控制器级别应用限制。

【问题讨论】:

    标签: ruby-on-rails ruby datagrid scope


    【解决方案1】:

    您不需要将资产传回网格。

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

    @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 中为它提出了一个新问题,并会告诉你。再次感谢伙计。
    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2016-01-26
    • 2013-03-26
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多