4

我有 2 个资源 - 书架和书,每个书架都有很多书。

有没有办法按书架对书籍(在书籍索引页面上)进行分组?具体来说,我希望书籍按书架排序,并且每当书架发生变化时,我想在书籍列表中指出这一点(在一个书架上的书籍和另一个书架上的书籍之间插入一个带有新书架名称的 h3 标题)

我正在使用 rails 3.2 和 activeadmin 0.6.0。

4

2 回答 2

5

在 Rails 4.2.5.2 上使用 ActiveAdmin 1.0.0.pre2,结果非常简单。该解决方案基本上只有 20 行自定义 ActiveAdmin 视图类。

请注意第一行的文件名,作为将代码放置在何处或对现有文件进行添加/更改的提示。

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.autoload_paths << config.root.join('lib')
  end
end
# models/book.rb
class Book < ActiveRecord::Base
  belongs_to :shelf

  def shelf_name
    shelf.name
  end
end
# admin/books.rb
ActiveAdmin.register Book do
  index as: :grouped_table, group_by_attribute: :shelf_name do
    # columns
  end
end
# lib/active_admin/views/index_as_grouped_table.rb
require 'active_admin/views/index_as_table'

module ActiveAdmin
  module Views
    class IndexAsGroupedTable < IndexAsTable

      def build(page_presenter, collection)
        if group_by_attribute = page_presenter[:group_by_attribute]
          collection.group_by(&group_by_attribute).sort.each do |group_name, group_collection|
            h3 group_name
            super page_presenter, group_collection
          end
        else
          super
        end
      end

    end
  end
end

让我解释一下他妈的发生了什么index_as_grouped_table.rb

该类IndexAsGroupedTable扩展了 ActiveAdmin 的IndexAsTable类并覆盖了build添加分组功能的方法。在您的admin/books.rb文件中,在 index 宏中,您定义了一个附加选项,用于命名要分组的类:group_by_attribute的属性名称。Book如果未提供该属性,它会退回到IndexAsTable的行为。如果提供了该属性,它将group_by按该属性、sort散列和每个散列运行一个块,使用group_namegroup_collection散列打印一个<h3>group_name然后调用IndexAsTable'sbuild方法 ( super) 以显示标准表。

如您所见,仅对组进行了排序,并将 h3 添加到页面中。其他一切都像标准索引表一样工作。

注意:这不涉及分组的额外 sql。这使用了类的 rubygroup_by​​ 方法Enumerable。因此,如果集合中有很多行,它可能会很慢。

对于最新版本和/或分叉,请访问我在 github 上的要点

该方法的功劳归于 ariejan de vroom

于 2016-03-10T12:08:57.837 回答
1

听起来像是自定义页面的工作

http://www.activeadmin.info/docs/10-custom-pages.html

  1. 通过在 Active Admin 控制器中传递有序的@books

  2. 然后在内容块中使用 table_for (可能每个架子都有一个新表?或者顶部的架子搜索字段。http: //blog.agile-pandas.com/2011/07/06/activeadmin-beyond-the-basics

:)

于 2013-06-28T07:54:55.630 回答