我正在使用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
我做错了什么?
答案 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,一切都开始正常了。
旁注:请记住,如果你在开发方面采取“大爆炸”方法(你不应该),那么当角色开始工作时,你可以将自己锁定在应用程序之外。