自定义 ActiveAdmin 范围以显示没有标签的书籍

Custom ActiveAdmin Scope to display books without a tag

我在 rails 应用程序中使用 ActiveAdmin。一切都很好,但现在我正在尝试创建一个可以显示没有标签的书籍的范围。

我在我的 Book 模型中创建了一个方法来帮助我执行此操作,但我无法在我的 ActiveAdmin 范围内使用它。

I keep getting 
undefined method `book_tags?'

如何创建一个只显示没有标签的图书的范围?

型号

class Book < ActiveRecord::Base
  has_many :book_mappings, dependent: :destroy
  has_many :tags, through: :book_mappings

  ###Find books without a tag
  def book_tags?
    tags.any?
  end

end

class BookMapping < ActiveRecord::Base
  belongs_to :book
  belongs_to :tag

end

class Tag < ActiveRecord::Base
  has_many :book_mappings, dependent: :destroy
  has_many :books, through: :book_mappings

end

ActiveAdmin

ActiveAdmin.register Book do

  ###Scope to shows all Books          
  scope :all, :default => true

  ###book_tags? does now work, I keep getting undefined method `book_tags?'
  scope :books_without_tags do |book|
    book.book_tags?
  end

end

它是未定义的,因为范围是 class 级别。 book 参数实际上是一个 ActiveRecord::Relation。您可以在块中对其进行细化。您可以使用作用域甚至 class 方法。

你可以按照以下方式做一些事情:

class Book < AR::Base
  scope :without_tags, -> { where.not(id: BookMapping.distinct.pluck(:book_id)) }
end

ActiveAdmin.register Book do
  scope :all, default: true
  scope :without_tags
end