0

私は ActiveRecord を学び始めたばかりで、すべてがどのように機能するかを理解するためにちょっとしたことを試しています。次の sqlite3 データベースで次のコードを試しました。

ルビー:

class Balances < ActiveRecord::Base
  def initialize
    @balance = 50
    update_attribute(:balance, @balance)
  end
  def withdraw amount
    update_attribute(:balance, @balance-amount)
  end
end

SQL:

CREATE TABLE balance(
    balance 50
);

私が書くとき:

balance = Balances.new

私は得る:

NoMethodError: undefined method `delete' for nil:NilClass
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/attribute_methods/write.rb:28:in `write_attribute'
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/attribute_methods/dirty.rb:67:in `write_attribute'
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/attribute_methods/write.rb:14:in `balance='
    from /Users/Solomon/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.3/lib/active_record/persistence.rb:180:in `update_attribute'

どうしてこれなの?私は何か間違ったことをしていますか?

4

1 に答える 1

4

私はいくつかのことに気づきました:

  • クラス名はBalance(大文字、単数) にする必要があります。データベース内のテーブル名は小文字、複数形になります。例えば、balances
  • initializeActiveRecord モデルのメソッドを定義しないでください。代わりにafter_initializeコールバックを使用してください。ポスト。また、Rails ドキュメント。

また、モデルのファイル名はbalance.rb(小文字、単数) にする必要があります。

さらに追加レコードのインスタンスが初期化されるたびに、レコードの残高を 50 に戻したいとは思わないでしょう。-- それがあなたの例が現在行っていることです。データベースの新規レコードの開始残高を 50 に設定する場合は、「before_create」コールバックを使用します。

ActiveRecord モデル クラスは、基礎となるデータベースのレコードに関連付けられていますが、それとは異なることに注意してください。たとえば、ActiveRecord モデルのインスタンスを作成した後、データベースに一致するレコードを作成しないことができます。-- データベース レコードは、save メソッドまたは create メソッドを呼び出した場合にのみ作成されます。

于 2012-06-01T00:14:18.010 に答える