2011-12-27 7 views
0

私のユーザモデルにdeviseのあるレールアプリがあります。私のアプリでは、ユーザーは登録を通じてコースに登録できます。私はhour_learnedとhours_taughtを追加しました。登録後、私は現在のユーザーに学習した時間を追加しようとしますが、なんらかの理由でそれは機能しません。私はエラーはありませんが、dbに挿入されません。ユーザーモデルに次のような登録メソッドがあります。ユーザアトリビュートレールの割り当てに問題がある

def enroll!(course, user) 
    enrollments.create!(:course_id => course.id, :active => true) 
    user.hours_taught = user.hours_taught + (course.hours_long) 
end 

はい、私は属性にアクセス可能であることを確認しました。まだ行きません。どんな助けでも大歓迎です。

+1

reocrdが無効の場合は例外が発生しますされ、メソッド内で、我々はcourseオブジェクトを取得し、登録に割り当て、時間の計算を行うと、その後save!を使用して、それを保存しますhours_taught属性の更新後に 'user.save'を呼び出します。 –

+0

しかし、ユーザーは既にdbに存在し、インスタンス変数ではありません。まだユーザーを保存する必要がありますか? – Zach

+0

あなたはまったく正しい、気持ちがいいとは思いません。私はそれを忘れたとは信じられません。 – Zach

答えて

1

オブジェクトをパラメータとして使用してUserモデルで定義するこの方法はなぜですか?あなたはこのようにそれを定義する必要があります。

def enroll!(course) 
    enrollments.create!(:course => course, :active => true) 
    self.hours_taught = self.hours_taught + (course.hours_long) 
    self.save! 
end 

あなたはこのようにそれを呼び出すことができますので、このメソッドは、このクラスのインスタンスメソッドとして定義されます。

user.enroll!(course) 

これは、あなたがする必要がないことを意味しますこのメソッドを引数として渡します。たぶん、あなたが必要とする(ActiveRecord::RecordInvalidまたはActiveRecord::RecordNotSavedのいずれか)

0

どのようなエラーメッセージが表示されますか?

また、通常、モデルのインスタンスメソッドにはobj自体のパラメータは含まれません。モデル内でselfを使用してください。例えば

class User << ActiveRecord::Base 
    ... 

    def enroll!(course) 
    enrollments.create!(:course_id => course.id, :active => true) 
    self.hours_taught = self.hours_taught + (course.hours_long) 
    save! 
    end 
    ... 

を追加しました ...なぜ必要とされている保存

はActiveRecordのは、実際には2つの場所でそのモデルのデータを追跡することを忘れないでください: 『メモリー』にし、データベースシステムに。

レコードのデータベースコピーの保存/更新には時間がかかりますので、レコードのインメモリバージョンの更新を多数行い、データベースに保存することをお勧めします。

また、状況に応じて、モデルに対する特定の操作をアトミックにして、更新されたモデルをデータベースに保存することもできます。

この例では、メソッドの名前を登録しました。 !あなたが登録をしたいことを意味する大会です!メソッドを使用してデータベースを更新するなど、 "すべて実行する"ことができます。

したがって、メソッド自体では、データをdbmsに保存する必要があります。

オブジェクトのメソッドにsaveを含めることの問題は、データベースへの保存が増えて本当に必要になることがあるということです。一度に複数の変更を保存するほうが、複数の保存をdbに行う方がはるかに優れています。しかし、あなたは節約を最小限に抑えるために自分自身をひもにねじりたくはありません。 - あなたのswの流れを計画している間、問題を念頭に置いてください。

関連する問題