我有2个资源 - 书架和书,每个书架都有很多书。
有没有办法按书架分组书籍(在书籍索引页面上)?具体来说,我希望书架按书架排序,每当货架更改时,我想在书籍清单上注明(在一个书架上的书籍和另一个书籍之间插入一个带有新书架名称的h3标题)
我使用的是rails 3.2和activeadmin 0.6.0。
答案 0 :(得分:3)
在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
文件中,在索引宏中,您定义了一个附加选项:group_by_attribute
,该选项命名要分组的Book
类的属性名称。
如果未提供该属性,则会回退到IndexAsTable
的行为。
如果提供了该属性,它将按该属性收集group_by
,sort
哈希并从该哈希中运行每个group_name
和group_collection
的块,使用<h3>
打印group_name
,然后只需调用IndexAsTable
build
方法(super
)即可显示标准表格。
如您所见,只对组进行排序并将h3添加到页面中。其他一切都像标准索引表一样。
注意:这不涉及用于分组的额外sql。这使用了
Enumerable
类的ruby的group_by
方法。因此,如果集合中有很多行,它可能会很慢。
获取最新版本和/或分支转到我的my gist on github。
该方法的积分转到ariejan de vroom。
答案 1 :(得分:1)
听起来像是自定义页面的作业
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
:)