Ответ 1
Fixed
column :type, :sortable => 'types.category'
Я разрабатываю приложение ActiveAdmin, и я хочу сортировать столбцы предприятий по их "типу". К сожалению, мой код не работает. Какой код следует использовать для этого? Вот мой код...
app/models/business.rb
class Business < ActiveRecord::Base
belongs_to :type
attr_accessible :description, :email, :facebook, :foursquare, :google, :manager,
:mobile, :name, :phone, :type_id, :url, :yelp
end
app/models/type.rb
class Type < ActiveRecord::Base
attr_accessible :category
has_many :businesses
def to_s
category
end
end
app/admin/businesses.rb
ActiveAdmin.register Business, { :sort_order => :name_asc } do
scope :joined, :default => true do |businesses|
businesses.includes [:type]
end
index do
column :name
column :type, :sortable => 'businesses.type'
column :manager
column :email
default_actions
end
end
Спасибо!
Fixed
column :type, :sortable => 'types.category'
в соответствии с этим обсуждением: https://github.com/gregbell/active_admin/pull/623, если вы не хотите использовать области действия, вместо этого вы можете использовать метод сбора данных:
ActiveAdmin.register Business, { :sort_order => :name_asc } do
scope :all, :default => true
index do
column :name
column :type, :sortable => 'types.category'
column :manager
column :email
default_actions
end
controller do
def scoped_collection
end_of_association_chain.includes(:type)
end
end
end
Да, программа scoped_collection, предоставленная Evgenia, отлично работает. Также для нескольких столбцов:
ActiveAdmin.register Foo do
index do
column :field_name_a, :sortable => 'association_a.field_name'
column :field_name_b, :sortable => 'association_b.field_name'
end
end
controller do
def scoped_collection
end_of_association_chain.includes([:association_a, :association_b])
end
end
Это можно сделать.
Здесь у меня есть модель под названием Star. Звезда принадлежит человеку. Я собираюсь поместить Person.name в индекс администратора Star, сделать его сортируемым, заставить его работать с областями и добавлять фильтры.
Сначала вам нужно добавить модель объединения в каждую вашу область. В этом случае у меня было 3 области: все, category_subscriptions и person_subscriptions. Я объявляю области и добавляю к ним модель соединения:
ActiveAdmin.register Star do
[ :all, :category_subscriptions, :person_subscriptions ].each do |sym|
scope(sym, :default => (sym == :all) ) do |stars|
stars.includes [:person]
end
end
end
Теперь, чтобы добавить имя человека из модели join в мой звездный индекс, я делаю это:
index do
id_column
column("Name", nil, :sortable => :"people.name") {|star| star.person.name}
column("Email", nil, :sortable => :"people.email") {|star| star.person.email}
default_actions
end
Пусть рассеется, что:
column("Name", nil, :sortable => :"people.name") {|star| star.person.name}
Теперь добавьте несколько фильтров. Это намного проще:
filter :person_name, :as => :string
filter :person_email, :as => :string
И все готово.