Я рекомендую вам создать новую модель, которая инкапсулирует поведение конечного автомата, а затем присоединить эту модель к накладной.
Если конечный автомат предназначен для представления состояния накладной, сделайте так InvoiceState belongs_to
Invoice и Invoice has_one
InvoiceState.
С другой стороны, если вы хотите использовать этот конечный автомат для представления более общей концепции полноты, тогда назовите его соответствующим образом generi c (TransactionState , et c.) и присоедините его через отношения полиморф c, как Примечание.
То, что я описываю, может выглядеть так:
class Note < ApplicationRecord
belongs_to :notable, polymorphic: true, optional: false
end
class Person < ApplicationRecord
has_many :notes, as: :notable, dependent: :destroy
end
class Invoice < ApplicationRecord
has_many :notes, as: :notable, dependent: :destroy
has_one :invoice_state, dependent: :destroy
end
class InvoiceState < ApplicationRecord
belongs_to :invoice, optional: false
state_machine :status, initial: :pending do
transition pending: :approved, on: %i[approve]
transition pending: :cancelled, on: %i[cancel]
end
end