Настройка 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!
Почему вы не используете 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