Контроллер 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, и все стало работать нормально.

Примечание: имейте в виду, что если вы используете подход "большого взрыва" в разработке (вы не должны), вы можете заблокировать себя из приложения, когда роли начинают работать.

Другие вопросы по тегам