Настройка has_many через фильтр с Active Admin

Я пытаюсь просто разрешить фильтрацию категорий на странице Locations для ActiveAdmin.

У меня есть три модели:

class Location < ActiveRecord::Base
  has_many :categories_locations
  has_many :categories, :through => :categories_locations

class CategoriesLocation < ActiveRecord::Base
    belongs_to :category
    belongs_to :location
end

class Category < ActiveRecord::Base
    has_many :categories_locations
    has_many :locations, :through => :categories_locations
end

На моей странице местоположений я использую этот фильтр:

ActiveAdmin.register Location do
  filter :name
  filter :category, :collection => proc { Category.all }, :as => :select

Тем не менее, он продолжает выдавать ошибку.

undefined method `category_eq' for #<MetaSearch::Searches::Location:0x007fd4f9b965d8>

Я пробовал фильтр: категории, фильтр: категории_положения, но ничего не будет работать.

Кто-нибудь сталкивался с этим - у кого-нибудь есть решение?

3 ответа

Решение

В какой-то момент has_many/through более гибок, чем habtm (вы можете иметь дополнительные поля и т. д.)

Я также искал то же самое и нашел рабочее решение как ниже. Размещение здесь, чтобы оно могло помочь другим в будущем.

приложение / администратор /location.rb

ActiveAdmin.register Location do
  filter :filter_by_category, label: 'Category', as: :select, collection: Category.pluck(:name, :id)

приложение / модель /location.rb

class Location < ActiveRecord::Base
  has_many :categories_locations
  has_many :categories, :through => :categories_locations

  def self.filter_by_category(category_id)
    category_id = 1 if category_id == true # this is required only for id=1, ActiveAdmin return it as `true`
    joins(:categories).where("categories.id = ?", category_id)
  end

  #  Add your custom method as ransack 
  def self.ransackable_scopes(_auth_object = nil)
    [:filter_by_category]
  end
end

Надеюсь, поможет..!!

Ответ на этот вопрос можно найти здесь, при условии, что вы можете написать свой, хотя многие в SQL!

Как добавить пользовательский фильтр в Active Admin?

Почему вы не используете habtm?

class Location < ActiveRecord::Base
  has_and_belongs_to_many :categories

class CategoriesLocation < ActiveRecord::Base
end

class Category < ActiveRecord::Base
    has_and_belongs_to_many :locations
end

а потом

ActiveAdmin.register Location do
  filter :name
  filter :category_id, :collection => proc { Category.all }, :as => :select
Другие вопросы по тегам