Ruby on Rails Active Admin — отображение повторяющихся записей для HABTM

Я разрабатываю базовый файловый менеджер (модель активов) в драгоценном камне Active Admin. Каждая группа активов HABTM и наоборот.

В моем ресурсе Active_admin Asset у меня есть фильтр, в котором я хочу иметь возможность выбирать несколько групп для фильтрации, поэтому я добавил:

filter :groups_id, :as => :check_boxes, :collection => proc {Group.all}

Все группы отображаются в виде флажков, как и ожидалось. Однако, если у меня есть актив_1, актив_2 и у меня есть группа_1, назначенная для актива_1 и актива_2, и группа_2 для актива_2, когда я фильтрую по обеим ролям, актив_2 перечисляет себя дважды.

Как я могу ограничить фильтр, чтобы использовать только «отдельные» или «уникальные» активы, которые будут возвращены?

У меня также есть другая проблема, заключающаяся в том, что фильтры вообще не работают ни в одном из моих прицелов.


person professormeowingtons    schedule 04.02.2012    source источник


Ответы (4)


has_and_belongs_to_many принимает параметр :uniq, который гарантирует, что будут возвращены только уникальные записи. Установка этого в вашей модели должна помочь.

class MyModel
  has_and_belongs_to_many :things, :uniq => true
end
person Greg Bell    schedule 04.02.2012
comment
Просто закрутил это и перезагрузил сервер rails, все еще имея ту же проблему. Я добавил параметр :uniq в модели Asset и Group. - person professormeowingtons; 04.02.2012
comment
Я не хочу указывать пальцем, так как вполне возможно, что я делаю что-то просто глупое неправильно, но это почти похоже на ошибку в ActiveAdmin ??? Даже если у меня есть только 1 актив, если я назначу его 2+ группам, а затем отмечу флажки для этих 2+ групп на боковой панели фильтра, 1 актив будет отображаться 2+ раза. См.: i.imgur.com/GbntK.png - person professormeowingtons; 04.02.2012
comment
Да, я считаю, что на данный момент это ошибка с отношениями HABTM в Active Admin. Флажки добавляют &q[groups_id_in][]=1&q[groups_id_in][]=2 к параметрам строки запроса в URL-адресе. Кажется, это заставляет Assets.where(:group_id =› 1) и Assets.where(:group_id =› 2), таким образом возвращая одни и те же записи несколько раз. - person professormeowingtons; 04.02.2012
comment
почему это помечено как ответ, если в комментариях указано, что это не сработало? есть ли проблема AA на github для этого? @professormeowingtons - person Will; 23.10.2015

Быстрое обновление ответа Уилла. Я использую Rails 5.0 и ActiveAdmin 1.0, и clean_search_params вернул ошибку. Но вместо этого это сработало:

def apply_filtering(chain)
  super
  @search.result(distinct: true)
end

Спасибо!

person Alex F.    schedule 25.06.2018
comment
Большое спасибо!! Следующим трюком будет выяснить, как сделать это значение по умолчанию для всех контроллеров... - person aec; 23.02.2021

Активное чтение администратора указывает на добавление

distinct: true 

для получения уникальных результатов.

Чтобы применить это к активному администратору, я использую это следующим образом:

controller do
  def apply_filtering(chain)
     @search = chain.ransack clean_search_params params[:q]
     @search.result(distinct: true)
   end
end
person Will    schedule 27.10.2015
comment
спасибо за ответ, хотя я не думаю, что эта функция существовала в 2012 году, когда я задал этот вопрос :( - person professormeowingtons; 27.10.2015
comment
не волнуйтесь. Я помещаю здесь частично для моей собственной ссылки. обязательно будет появляться довольно часто. - person Will; 27.10.2015
comment
Последняя версия ActiveAdmin удалила аргумент из метода clean_search_params. Таким образом, строка должна теперь читаться как @search = chain.ransack clean_search_params - person Hari Gopal; 18.04.2016

... и, быстрое дополнение, ответ Алекса:

Если вы хотите сделать это для всех контроллеров в вашем приложении, вы можете добавить это в инициализатор (мой называется active_admin_patches.rb) -

# This guarantees that the results for a filtered #index page search do not appear more than once, on any #index page in the AA app
# TODO: THIS WILL PROBABLY FAIL WITH SOME FUTURE UPDATE, SO BE READY TO UPDATE IT FROM THE LATEST GEM SOURCE
module ActiveAdmin::ResourceController::DataAccess
  # Applies any Ransack search methods to the currently scoped collection.
  # Both `search` and `ransack` are provided, but we use `ransack` to prevent conflicts.
  def apply_filtering(chain)
    @search = chain.ransack(params[:q] || {})
    # This is the original line
    # @search.result
    # This is the patch
    @search.result(distinct: true)
  end
end

Я не уверен, почему кто-то не хотел бы сделать это поведением по умолчанию, но, вероятно, на это есть причина. Хм, может быть, для случаев, когда столбец представления индекса является одной из нечетких строк. Да, это должно быть так.

Кроме того, должен быть лучший способ исправить это менее навязчиво, но я спешу. :-)

person aec    schedule 23.02.2021