STI模型activeadmin控制器显示所有子类的实例

时间:2013-07-03 02:58:00

标签: ruby-on-rails-3 activerecord activeadmin single-table-inheritance

我正在使用activeadmin来管理我的rails应用程序的模型。我有一个使用can can separate role model的用户模型,这些角色使用继承建模,并在ActiveRecord上使用STI。

问题在于,无论我在哪个角色'activeadmin控制器页面上,填充的索引都显示了子类的所有Role实例

示例:

我创建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

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 个答案:

答案 0 :(得分: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,一切都开始正常了。

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