NameError при создании связанного объекта из-за изменения атрибута

Вот что я пытаюсь добиться: у Моих Предметов много действий. Когда статус Предмета изменится, создайте новое Действие. Позже я буду просить пункт для связанных с ним действий. К сожалению, я получаю следующее исключение, когда пытаюсь выполнить действие через изменение статуса: NameError at /create; uninitialized constant Shiny::Models::Item::Action,

Вот мои модели:

module Models
  class Item < Base
    has_many :actions

    def status=(str)
      @status = str
      actions.create do |a|
        a.datetime = Time.now
        a.action = str
      end
    end
  end

  class Actions < Base
    belongs_to :item
  end

  class BasicFields < V 1.0
    def self.up
      create_table Item.table_name do |t|
        t.string :barcode
        t.string :model
        t.string :status
      end

      create_table Actions.table_name do |t|
        t.datetime :datetime
        t.string   :action
      end
    end
  end
end

Затем в контроллере:

class Create
  def get
    i = Item.create
    i.barcode = @input['barcode']
    i.model = @input['model']
    i.status = @input['status']
    i.save

    render :done
  end
end

1 ответ

Пока не будет представлен лучший ответ, объясняющий, где Item::Action пришел, вот как я это исправил:

module Models
  class Item < Base
    has_many :actions

    def status=(str)
      # Instance variables are not propagated to the database.
      #@status = str
      write_attribute :status, str
      self.actions.create do |a|
        a.datetime = Time.now
        a.action = str
      end
    end
  end

  # Action should be singular.
  #class Actions < Base
  class Action < Base
    belongs_to :item
  end

  class BasicFields < V 1.0
    def self.up
      create_table Item.table_name do |t|
        t.string :barcode
        t.string :model
        t.string :status
      end

      create_table Action.table_name do |t|
        # You have to explicitly declare the `*_id` column.
        t.integer  :item_id
        t.datetime :datetime
        t.string   :action
      end
    end
  end
end

Очевидно, я нуб AR.

Другие вопросы по тегам