【问题标题】:Rails ActiveAdmin how to use model scope inside admin after_create blockRails ActiveAdmin 如何在 admin after_create 块中使用模型范围
【发布时间】:2021-05-20 21:18:46
【问题描述】:

我有一个模型 Book,它有一个名为 status 的 db 列,并定义了如下范围:

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

是否可以在代码内部使用模型范围而不是用于范围视图或过滤器?使用我得到的当前代码:

NoMethodError(#Book:0x00007fa22ce65458 的未定义方法“获取”):

【问题讨论】:

    标签: ruby-on-rails activeadmin


    【解决方案1】:

    由于acquired 是一个作用域,你必须写:

    if book.in?(Book.acquired)
    

    或者

    if book.status == 'acquired'
    

    【讨论】:

    • 这基本上意味着 ActiveAdmin 不支持 AR 范围
    • 我不明白你的评论。 AA 确实通过其scope dsl 声明“支持”它们。也许你期待更多的魔法?你可以在你的模型def acquired 中创建一个方便的方法。 AR 中的范围是在class 级别上定义的,而不是在实例级别上。
    • 我期望与常规 Rails 类中的行为相同,这意味着如果我有一个 AR 对象,我可以在其上调用范围。如果这是“更神奇”,那么是的,我期待更多“神奇”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多