2013-06-27 73 views
2

我有2個資源 - 書架和書本,其中每個書架都有很多書籍。activeadmin資源索引頁上的組記錄

有什麼辦法可以通過Shelf對圖書進行分組(書本索引頁)?具體而言,我希望書籍按書架排序,並且每當書架更改時,我想指出在書籍列表中(插入一個書架上的新書架名稱與書架之間的新書架名稱)

I我正在使用rails 3.2和activeadmin 0.6.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_namegroup_collection的塊,印刷<h3>group_name然後只是調用IndexAsTablebuild方法(super )顯示標準表。

就像你看到的,只有這些組被排序,並且一個h3被添加到頁面中。其他一切都像標準索引表一樣工作。

注意:這不涉及額外的sql分組。這使用Enumerable類的ruby的group_by方法。因此,如果集合中有許多行,它可能會很慢。

對於最新版本和/或叉子去我的my gist on github

貸款的方法去ariejan de vroom

+0

對我來說,它的工作,但分組只行當前頁 – okliv

+0

okliv,它適用於分頁資源索引的任何頁面上我。 – glasz