Rails ActiveAdmin как использовать область модели внутри блока admin after_create

#ruby-on-rails #activeadmin

Вопрос:

У меня есть модель Book , в которой есть столбец бд с именем status и определенной областью действия, как показано ниже:

 class Book < ApplicationRecord
  STATUSES = %w[planned acquired].freeze

  validates :status, inclusion: { in: STATUSES }

  scope :acquired, -> { where(status: 'acquired') }
end
 

Теперь внутри ActiveAdmin admin/books.rb я хочу использовать эту область, чтобы проверить, была ли приобретена книга, как показано ниже:

 ActiveAdmin.register Book do
  (...)

  after_create do |book|
    BookInfo.create!(book: book)
    BookCost.create!(book: book) if book.acquired
  end
end
 

Можно ли использовать область модели внутри кода не для представления области или фильтров? с текущим кодом я получаю:

Ошибка nometoderror (неопределенный метод «приобретен» для #Книги:0x00007fa22ce65458):

Ответ №1:

Как acquired и в случае с областью действия, вам придется написать:

 if book.in?(Book.acquired)
 

Или

 if book.status == 'acquired'
 

Комментарии:

1. Что в основном означает, что ActiveAdmin не поддерживает области AR

2. Я не понимаю вашего комментария. AA «поддерживает» их с помощью своего scope заявления dsl. Может быть, вы ожидали еще большего волшебства? Вы могли бы сделать удобный метод в своей модели def acquired . Области в AR определяются на class уровне, а не на уровне экземпляра.

3. Я ожидал того же поведения, что и в обычном классе Rails, что означает, что если у меня есть объект AR, я могу вызвать область действия для него. Если это «больше магии», то да, я ожидал большего «волшебства».