Контроллер activeadmin модели STI показывает экземпляры всех подклассов
Я использую activeadmin для управления моделями моего приложения rails. У меня есть модель User, которая использует модель ролей can can отдельно, и эти роли моделируются с наследованием и используют STI на ActiveRecord.
Проблема в том, что независимо от того, на какой странице контроллера Activeadmin у меня есть роли, заполненный индекс показывает все экземпляры Role подклассов.
Пример:
Я создаю экземпляры RoleA и RoleB. Затем я перехожу на страницу индекса RoleA, и RoleB отображается в списке. Происходит и обратное.
Детали
У меня есть несколько разных ролей, которые следуют шаблону ролевых объектов, где у меня есть абстрактная роль и ее подклассы. Я использую этот шаблон, потому что один пользователь может иметь более одной роли. С другой стороны, роли имеют общие базовые атрибуты, но отличаются по некоторым из них, поэтому наследование используется для моделирования этих ролей.
ROLE
|
---> RoleA
|
---> RoleB
|
---> RoleC
У меня есть эта миграция для ИППП
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.string :name #this is the name I want the role to show up on screen
t.references :role_a_attr
t.references :role_b_attr
t.string :type
t.timestamps
end
end
end
В моих контроллерах activeadmin я зарегистрировал: Role, RoleA, RoleB и RoleC. Роль
ActiveAdmin.register Role do
config.clear_action_items! # We don't want to create this kind of objects directly
index do
column :id
column :name
default_actions
end
end
RoleA
ActiveAdmin.register RoleA do
#we only want one super admin role
config.clear_action_items! if RoleA.first
menu :parent => 'Roles'
show do
attributes_table do
row :id
row :name
row :created_at
row :updated_at
end
end
end
RoleB
ActiveAdmin.register RoleB do
menu :parent => 'Roles'
end
ROLEC
ActiveAdmin.register RoleC do
menu :parent => 'Roles'
end
Что я делаю неправильно?
1 ответ
Видимо ActiveAdmin не нравится настройка по умолчанию. В документации по Rails рекомендуется в любом случае изменить имя по умолчанию, поэтому я добавил это в свой файл миграции
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
# some other attributes
t.string :object_type #this will be your 'type' column from now on
t.timestamps
end
add_index :roles, :object_type
end
end
Затем на роль класса я добавил
set_inheritance_column 'object_type'
Удивительно, но это изменение не дало никакого эффекта после выполнения рейка db:migrate. Поэтому я сделал db:drop, db:reset, db:migrate и db: seed, и все стало работать нормально.
Примечание: имейте в виду, что если вы используете подход "большого взрыва" в разработке (вы не должны), вы можете заблокировать себя из приложения, когда роли начинают работать.