0

これが私がやろうとしていることです:私のアイテムには多くのアクションがあります。案件のステータスが変化したら、新しいアクションを作成します。後で、アイテムに関連付けられたアクションを要求します。残念ながら、ステータス変更によってアクションを作成しようとすると、次の例外が発生します: 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
4

1 に答える 1

0

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 初心者です。

于 2012-06-12T23:02:15.547 に答える