我有 2 个资源 - 书架和书,每个书架都有很多书。
有没有办法按书架对书籍(在书籍索引页面上)进行分组?具体来说,我希望书籍按书架排序,并且每当书架发生变化时,我想在书籍列表中指出这一点(在一个书架上的书籍和另一个书架上的书籍之间插入一个带有新书架名称的 h3 标题)
我正在使用 rails 3.2 和 activeadmin 0.6.0。
我有 2 个资源 - 书架和书,每个书架都有很多书。
有没有办法按书架对书籍(在书籍索引页面上)进行分组?具体来说,我希望书籍按书架排序,并且每当书架发生变化时,我想在书籍列表中指出这一点(在一个书架上的书籍和另一个书架上的书籍之间插入一个带有新书架名称的 h3 标题)
我正在使用 rails 3.2 和 activeadmin 0.6.0。
在 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_name
该group_collection
散列打印一个<h3>
,group_name
然后调用IndexAsTable
'sbuild
方法 ( super
) 以显示标准表。
如您所见,仅对组进行了排序,并将 h3 添加到页面中。其他一切都像标准索引表一样工作。
注意:这不涉及分组的额外 sql。这使用了类的 ruby
group_by
方法Enumerable
。因此,如果集合中有很多行,它可能会很慢。
对于最新版本和/或分叉,请访问我在 github 上的要点。
听起来像是自定义页面的工作
http://www.activeadmin.info/docs/10-custom-pages.html
通过在 Active Admin 控制器中传递有序的@books
然后在内容块中使用 table_for (可能每个架子都有一个新表?或者顶部的架子搜索字段。http: //blog.agile-pandas.com/2011/07/06/activeadmin-beyond-the-basics
:)