1

我正在使用 activeadmin 来管理我的 rails 应用程序的模型。我有一个使用可以分离角色模型的用户模型,这些角色通过继承建模并在 ActiveRecord 上使用 STI。

问题是,无论我在哪个角色的 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

角色C

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

我究竟做错了什么?

4

1 回答 1

0

显然 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,一切都开始正常了。

旁注:请记住,如果您在开发中采用“大爆炸”方法(您不应该),您可以在角色开始工作时将自己锁定在应用程序之外。

于 2013-07-15T01:01:30.870 回答