ActiveAdmin:如何处理大型关联

rog*_*rkk 5 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
Run Code Online (Sandbox Code Playgroud)

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

添加了一些人的组织

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

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

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

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

sca*_*er2 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