Rails ActiveAdmin和has_many关联

时间:2013-02-05 12:07:46

标签: ruby-on-rails ruby-on-rails-3 activeadmin

我对active_admin相当新,我想知道是否有办法实现以下目标

我有两个型号

User
  belongs_to :group

Group
 has_many :users

我已成功为组和用户创建activeadmin页面,现在我想要的是显示属于某个组的用户。我在组索引页面上有按钮manage_members,它应该只显示该组的成员。我可以从组中删除成员或添加更多成员。

这是我迄今为止所做的事情

member_action :manage_members do
    @group = Group.find(params[:id])
    @page_title = "Manage Groups > @#{@group.name}, Edit Members"
end

和视图app / vies / admin / groups / manage_users.html.arb

table_for assigns[:group].users do
  column "Name" do |u|
    u.user_id
  end
  column "email" do |u|
    u.user.email
  end
  column "Created Date" do |u|
    u.user.created_at
  end

  column "OfficePhone" do |u|
    u.user.office_no
  end
end

这显示了组的成员,但是我必须在这个页面上做所有的工作来添加编辑删除一个成员,我不能在这里有active_admin过滤器和其他很酷的东西,这就像一个自定义页面,

是否有办法建立索引页面(具有过滤器批处理操作的所有优点等)(如用户的那些),但只显示组的用户。像一个范围索引页面,它显示在一个组的用户,我对该页面的控制与任何活动的管理索引页面相同?更像是下面的图片

This is What I mean by index page

而不是必须完成我目前看起来像

的所有工作

I dont want this

对于active_admin来说,这是非常新的,如果我确实缺少了一些非常直接的东西,请道歉。

由于

1 个答案:

答案 0 :(得分:1)

也许过滤器会这样做。这看起来像(把它放在你放置member_action的文件中)

filter :group, :as => :select, :collection => proc { Group.for_select }

proc用于确保对组(添加/删除/ ..)的更改立即反映到过滤器中的选择列表中。这与生产中的类缓存有关。 别忘了将此范围放在您的组模型中。

scope :for_select, :select => [:id, :name], :order => ['name asc']

另一种方法是使用范围。如果你的Group模型中有一个字段,比如可以作为方法头的slug / label,那么你可以在activeadmin用户注册块中执行类似的操作:

Group.all.each do |group|
  # note the sanitization of the Group name in the gsub
  scope "#{group.name.gsub(/-/,'_')}".to_sym
end

这在您的用户模型中:

Group.all.each do |group|
  # note the sanitization of the Group name in the gsub
  scope "#{group.name.gsub(/-/,'_')}".to_sym, joins(:group).where("group.name = ?",role.name)  
  # using joins(:group) or joins(:groups) makes a difference,
  # so not sure as I have not tested, but maybe the where should be
  # ....where("groups.name = ....
end

它应该为您提供索引视图上方的漂亮按钮,例如:http://demo.activeadmin.info/admin/orders

如果你想要这个与has_and_belongs_to_many的关系,我建议你看看这个Rails3 Active Admin - How to filter only records that meet all checked items in collection

祝你好运!