mis*_*222 4 grouping ruby-on-rails activeadmin ruby-on-rails-3.2
我有 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
Run Code Online (Sandbox Code Playgroud)
# models/book.rb
class Book < ActiveRecord::Base
belongs_to :shelf
def shelf_name
shelf.name
end
end
Run Code Online (Sandbox Code Playgroud)
# admin/books.rb
ActiveAdmin.register Book do
index as: :grouped_table, group_by_attribute: :shelf_name do
# columns
end
end
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
让我解释一下他妈的发生了什么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。这使用了 ruby 的类
group_by方法Enumerable。因此,如果集合中有很多行,它可能会很慢。
对于最新版本和/或分叉,请访问我在 github 上的要点。
听起来像是自定义页面的工作
http://www.activeadmin.info/docs/10-custom-pages.html
通过在活动管理控制器中传递有序的@books
然后在内容块中使用 table_for (也许每个架子都有一个新表?或者顶部的架子搜索字段。http: //blog.agile-pandas.com/2011/07/06/activeadmin-beyond-the-basics
:)
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |