【问题标题】:ActiveAdmin - Using scopes with filtersActiveAdmin - 使用范围和过滤器
【发布时间】:2012-05-09 20:12:14
【问题描述】:

在我的 ActiveAdmin 模型中,我有一个自定义范围来显示已删除的记录和几个过滤器,用于按特定列搜索记录。

单独使用过滤器或组合使用过滤器可以按预期工作。

使用作用域按预期工作。

问题在于,使用范围似乎会覆盖所有过滤器,并且在选择范围后,添加的任何过滤器都不会执行任何操作。

这里有人有什么想法吗?我想要的是能够显示特定范围,然后仍然能够过滤该范围内的结果。

    ActiveAdmin.register Example do
      scope :deleted do |example|
        Example.only_deleted
      end

      scope :all do |example|
        Example.with_deleted
      end

      filter :title
      filter :description

      index do
        column :title
        column :description
      end

    end

[更新]

这是我采用的解决方案。我在模型上设置了 with_deleted 范围,并在侧面包含过滤器以显示/隐藏已删除的结果。不理想,因为还会显示最初删除的结果,但至少所有过滤器可以一起使用。

    ActiveAdmin.register Example.with_deleted do

      filter :title
      filter :description
      filter :deleted, :as => :select, :collection => {:true => nil, :false => false }

      index do
        column :title
        column :description
      end

    end

【问题讨论】:

标签: ruby-on-rails activeadmin formtastic


【解决方案1】:

默认情况下,ActiveAdmin 希望范围只提供一个符号化的方法名称。当您以这种方式定义范围时,它们可以链接到过滤器已经提供的范围,并且它们可以无缝地协同工作。

所以您的错误是明确调用 Model#class_method 而不是提供 :symbolized_class_method_name(隐含当前模型的所有者)。

如果您替换此代码,过滤器和范围将协同工作:

scope :all do |example|
  Example.with_deleted
end

scope :deleted do |example|
  Example.only_deleted
end

有了这个:

scope "Deleted", :only_deleted
scope "All", :with_deleted

【讨论】:

  • 五年后,ActiveAdmin 文档仍然没有解决这个问题。在我弄清楚之前我遇到了同样的问题。
  • 对于来自谷歌的人(比如我),我想补充一点,如果使用正确,范围可以工作。因此,与其写scope :all do |example| Example.with_deleted end,不如写scope :all do |example| example.with_deleted end
【解决方案2】:

而不是范围创建另一个过滤器,它将根据是否删除示例或全部来选择标准上的记录。并根据需要应用尽可能多的过滤器。

或者在计算您将在其上运行过滤器的选择器时在过滤器中相应地运行范围,然后将过滤器条件放在该选择器上。

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2014-12-14
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多