lambda { s-6ren">
gpt4 book ai didi

ruby-on-rails - 如何根据 Rails 中的当前范围修改数据网格上的过滤器

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:01 24 4
gpt4 key购买 nike

这是我的众多过滤器之一:

 filter(:item_id, :enum,
:header => "Category",
:select => lambda { scope.select(" distinct(category.title), transactions.item_id ").map {|p| [p.title, p.item_id]}},
:multiple => false,
:include_blank => true
) do |value|
self.where(:items => { :id => value } )
end

如您所见,它正在从数据库中调用类别(所有类别)

在我的 SalesReportController 报告中,我有这个:

  def index
user_acls = find_current_user_acls
@grid = SalesReportsGrid.new(params[:sales_reports_grid]) do |scope|
scope.where("access_lists.id" => user_acls).page(params[:page])
end
@grid.assets

end

这将给我生成网格并传递给 View 的范围。

现在我需要设置过滤器以仅显示该用户已售出的类别。

我需要做的是以某种方式将 user_acls 传递给 SalesReportsGrid

如果我可以传递 user_acls 那么我可以这样做:

 filter(:item_id, :enum,
:header => "Category",
:select => lambda { scope.select(" distinct(category.title), transactions.item_id ").where("access_lists.id" => user_acls).map {|p| [p.title, p.item_id]}},
:multiple => false,
:include_blank => true
) do |value|
self.where(:items => { :id => value } )
end

快速解释:

例如:

User1 是代理她售出了 4 个类别的 100 件商品。她转到报告页面。目前,基于上面的代码,我只向她展示了她自己出售的商品,但是过滤器下拉列表包含数据库中的所有类别,这些类别没有意义。

不幸的是,我的 ACL 模块有点细化,当我尝试在 SalesReportsGrid (sales_reports_grid.rb) 中扩展它时,某些方法出现未定义错误。这是因为我的 Authentication 模块有很多来自其他模块的其他方法,例如 Devise 和 Declarative Authorization。所以我认为 extend 不会成为这里的一个选项。提前致谢

编辑:

在 Controller 中:

def index
# This will return an array of ACL ids for the user
user_acls = find_current_user_acls

@grid = SalesReportsGrid.new(params[:sales_reports_grid].merge(user_acls: user_acls)) do |scope|
scope.where("access_lists.id" => user_acls).page(params[:page])
end
@grid.assets
end

除了我得到的错误:undefined method merge for nil:NilClass

params[:sales_reports_grid] 中没有任何内容,这就是我收到错误的原因。

当我单独使用此 SalesReportsGrid.new(user_acls: user_acls ) 时,我得到了结果。

我猜这是我的 ActiveRecord 的限制:(

我在 SalesGrid attr_accessor :user_acls 中添加了这个

谢谢

所有工作伙伴:

请你解释一下我无法理解的一点:当我添加这个时::select => lambda { scope.select("distinct(categories.title), transactions.item_id ").where("access_lists.id"=> :user_acls).map {|p| [p.title, p.item_id]} }

:user_acls 值从未返回,但是当我这样做时:

 def categories_select
scope.select(" distinct(category.title), transactions.item_id ").where("access_lists.id" => user_acls).map {|p| [p.title, p.item_id]}

end

并添加 :select => :categories_select 一切正常。

干杯。

最佳答案

您可以将任何对象传递给 Datagrid 对象。

例如 current_user、ALC 对象或可访问类别。

因此在您的情况下,解决方案如下所示:

class SalesReportsGrid
scope { ... }

attr_accessor :user_ucls

filter(:item_id, :enum, select: :categories_select, ...) do
...
end


def categories_select
scope.select(" distinct(category.title), transactions.item_id ").where("access_lists.id" => user_acls).map {|p| [p.title, p.item_id]}
end

end

SalesReportsGrid.new(params.fetch(:sales_reports_grid, {}).merge(user_acls: user_acls))

请注意,为了从 select 选项访问网格对象数据,您需要将其提取到一个方法中。

您提到的错误是由 Nil 类限制引起的:nil.merge({})。为了避免这种情况,请使用 fetch 方法将默认值添加到 Hash,如上例所示。

关于ruby-on-rails - 如何根据 Rails 中的当前范围修改数据网格上的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com