Подтвердить что ты не робот

Фильтр по атрибуту родительского объекта в ActiveAdmin

Я хотел бы иметь возможность фильтровать объект на основе его атрибута parent:

class Call < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :calls
end

Я хотел бы иметь возможность сделать это:

ActiveAdmin.register Call do
  filter :user
end

и отфильтруйте его на user.name, а не выберите всех пользователей. Это можно сделать?

4b9b3361

Ответ 1

Решение Дениса почти сработало для меня. Мне просто нужно было добавить тип фильтра. Например:

ActiveAdmin.register Call do
  filter :user_name, :as => :string
end

Ответ 2

Попробуйте следующее:

ActiveAdmin.register Call do
  filter :user_name
end

Поскольку ActiveAdmin использует meta_search для фильтров, их документ очень полезен: https://github.com/ernie/meta_search

Ответ 3

Вы можете использовать вложенные ресурсы из InheritedResource, который используется ActiveAdmin, поэтому ваш список автоматически фильтруется родителем.

ActiveAdmin.register User do
  # this is the parent resource
end

ActiveAdmin.register Call do
  belongs_to :user # nested below resource user
end

Затем вы можете использовать маршруты рейка, чтобы увидеть новые вложенные маршруты, созданные ActiveAdmin:) Надеемся, что это поможет

Ответ 4

В следующей версии ActiveAdmin (я работаю с 1.0.0.pre) вы можете использовать методы Ransack. Итак, скажем, у вас есть статья, которая принадлежит пользователю.

У вас будет следующий файл admin/article.rb

ActiveAdmin.register Article do

  controller do
    def scoped_collection
      Article.includes(:user)
    end
  end  

  index do      
   column :id
   column :created_at
   column :title
   column("Author", sortable: 'users.first_name') { |item| link_to item.user.full_name, user_path(item.user) }
   actions
  end

  filter :user_first_name_cont, :as => :string
  filter :user_last_name_cont, :as => :string  

end

Здесь user_first_name_cont - метод ransack, который фильтрует ассоциированное имя пользователя first_name и "cont".