Фильтр по атрибуту родительского объекта в ActiveAdmin - PullRequest
11 голосов
/ 27 октября 2011

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

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 вместо того, чтобы представлять выборку всех пользователей.Можно ли это сделать?

Ответы [ 5 ]

30 голосов
/ 12 января 2012

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

ActiveAdmin.register Call do
  filter :user_name, :as => :string
end
8 голосов
/ 11 ноября 2011

Попробуйте это:

ActiveAdmin.register Call do
  filter :user_name
end

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

3 голосов
/ 02 декабря 2011

Вы можете использовать вложенные ресурсы из 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 :). Надеюсь, это поможет

2 голосов
/ 25 мая 2014

В следующем выпуске 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 - это метод рансак, который фильтрует ассоциированного пользователя first_name и означает, что 'cont' содержит.

0 голосов
/ 29 августа 2018

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

Пример

class User < ActiveRecord::Base
  belongs_to :user
end

class Email < ActiveRecord::Base
  has_one :email
end

Чтобы отфильтровать пользователей на основевы делаете это на их электронных письмах (не забывайте часть as: :string, поскольку она дает вам доступ к методам поиска Ransack, таким как содержит и т.п.)

ActiveAdmin.register User do
  filter :user_email, :as => :string
end
...