Контроллер ActiveAdmin модели STI показывает экземпляры всех подклассов

Я использую activeadmin для управления моделями моего приложения rails. У меня есть модель пользователя, которая использует может разделить ролевую модель и те роли моделируются с наследованием и используют STI в ActiveRecord.

Проблема в том, что независимо от того, на какой странице контроллера ActiveAdmin я нахожусь, заполняемый индекс показывает все экземпляры Роли подклассов.

Пример:

Я создаю экземпляры RoleA и RoleB. Затем я перехожу на индексную страницу RoleA, и в списке отображается RoleB. Бывает и наоборот.

Подробности

У меня есть несколько разных ролей, которые следуют шаблону роли-объекта, где у меня есть абстрактная роль и ее подклассы. Я использую этот шаблон, потому что у одного пользователя может быть более одной роли. С другой стороны, роли имеют общие базовые атрибуты, но некоторые из них различаются, поэтому для моделирования этих ролей используется наследование.

ROLE
|
---> RoleA
|
---> RoleB
|
---> RoleC

У меня есть эта миграция для STI

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

РольA

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

РольB

ActiveAdmin.register RoleB do
  menu :parent => 'Roles'
end

Роль

ActiveAdmin.register RoleC do
  menu :parent => 'Roles'
end

Что я делаю неправильно?


person Pacu    schedule 03.07.2013    source источник


Ответы (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'

Удивительно, но это изменение не дало никакого эффекта после выполнения rake db:migrate. Итак, я сделал db:drop, db:reset, db:migrate и db:seed, и все заработало нормально.

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

person Pacu    schedule 15.07.2013