ActiveAdmin:如何处理大型关联

时间:2015-01-28 15:20:09

标签: ruby-on-rails activeadmin

我正在构建一个界面来管理可以连接很多人的组织。总人数由几千人组成。

据我所知,AA对于这种情况并没有真正的好系统。

到目前为止,我在表单块中使用了类似的内容来添加/删除组织中的人员:

f.has_many :person_organizations, for: [:person_organizations, f.object.person_organizations.active] do |connection_f|

  all_people = Person.select([:id, :firstname, :lastname]).order(:firstname, :lastname)

  connection_f.input :person, as: :select,
                              collection: all_people,
                              member_label: proc { |d| "#{d.firstname} #{d.lastname}"
  unless connection_f.object.nil?
    # Show the destroy checkbox only if it is an existing person
    # else, there's already dynamic JS to add / remove new dentists
    connection_f.input :_destroy, as: :boolean, label: 'Delete this connection'
  end
end

问题在于,在向组织添加一些人之后,生成所有选择框所花费的时间开始变得很大,因为它必须为每个元素执行相同的工作。见下文(“slett denne koblingen”的意思是“删除此连接”)

Organization with some people added

有谁知道减轻这种疼痛的方法?

我有几个想法,但我不太明白我将如何实现它们:

  • 在设置关联后,仅显示带有人名的文本字符串,而不是选择框。但仍需要能够删除关联,并创建新的关联。
  • 以某种方式缓存生成的选择框。选择正确的值可能会给AA一些问题吗?

此外,我知道有一个github问题正在讨论这种挑战的解决方案,但似乎还有一段距离,如果它将被实施:https://github.com/activeadmin/activeadmin/issues/2692#issuecomment-71500513

2 个答案:

答案 0 :(得分:1)

我遇到了同样的迟钝。您面临的挑战是将创建的已填充选择的数量。我建议使用某种形式的AJAX和Select2 / Chosen组合来“自动完成”文本框输入。这将大大减少HTML占用空间并加快加载时间。您的管理员也可能更了解用户体验。

https://github.com/activeadmin/activeadmin/issues/1754

https://github.com/mfairburn/activeadmin-select2

Viget Labs有一个gem,它为处理自动完成关联提供了另一种解决方案。 https://github.com/vigetlabs/active_admin_associations

答案 1 :(得分:0)

面对你所描述的同样问题,我发现你的第一个假设是最好的。

需要说的是,我首先尝试过这种选择2,而且它没有帮助,甚至让事情变得更慢。这是因为在这种情况下大部分时间的rails都不是在查询数据库(否​​则selecta with ajax会有所帮助),但是" drawing"观点。因此,当你要求rails绘制更复杂的视图时,它会以速度失败。

所以我做了很简单的事情:on" has_many"部分你已经描述过我:

f.inputs 'Personer' do
      f.has_many :person_organizations, for: [:person_organizations, f.object.person_organizations.active], new_record: false do |connection_f|
        if connection_f.object.person.present?
          li connection_f.object.person.name
          li link_to 'destroy', { controller: :person_organizations, action: :destroy, id: connection_f.object.id }, method: :delete, data: { confirm: 'Are you sure?' }
          li link_to 'edit', edit_admin_person_organization_path(connection_f.object)
        end
      end
    end

    li link_to 'Add new person-organization connection', new_admin_person_organization_path(id: f.object.id)

并在ActiveAdmin.register PersonOrganization文件中我有一些自定义重定向,以重定向到" parent"模型。

controller do
  def update
    update! do |format|
      format.html { redirect_to edit_admin_medical_practice_path(resource.organization) } if resource.valid?
    end
  end
end

这改变了我的慢速AA页面要快一点。