2011-12-27 46 views
0

我有一個設計用於我的用戶模型的Rails應用程序。在我的應用程序中,用戶可以通過註冊參加課程。我添加了hour_learned和hours_taught。註冊後,我嘗試將學習的小時數添加到當前用戶,但出於某種原因,它不起作用。我沒有得到任何錯誤,但它不會插入數據庫。我有一個登記方法在我的用戶模型,看起來像這樣:麻煩分配用戶屬性Rails

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

是的,我確信的屬性都可以訪問。仍然沒有去。任何幫助將非常感激。

+1

也許你需要在更新hours_taught屬性後更新'user.save'。 –

+0

但用戶已經存在於數據庫中,它不是一個實例變量。我仍然應該使用.save? – Zach

+0

不要緊,你是完全正確的,很好的電話。不能相信我忘了那個。 – Zach

回答

1

爲什麼您在User模型上定義的方法是以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) 

這意味着你將不再需要通過用戶作爲參數這個方法。裏面的方法,我們採取course對象,並將其分配給招生,做小時的數學,然後使用save!保存它,如果reocrd是無效的,這將引發一個異常(可以是ActiveRecord::RecordInvalidActiveRecord::RecordNotSaved

0

msg你得到了什麼錯誤?

此外,通常模型的實例方法不包含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的真正跟蹤它的模型的數據在兩個地方:在‘記憶’,並在數據庫系統中。

由於保存/更新記錄的數據庫副本在時間上很昂貴,因此您可能需要對記錄的內存版本進行一些更新,然後將其保存到數據庫中。

或者,根據具體情況,您可能希望針對模型的給定操作是原子操作,並且包括將更新的模型保存到數據庫。

在這個例子中,你已經命名了方法註冊! !!是一個暗示你想要報名的慣例!方法來「全部完成」,包括更新數據庫。

因此,在方法本身中,您需要將數據保存到dbms。

在對象的方法中包含save的問題是,您最終可能會得到更多的數據庫保存,然後真的需要。一次保存多個更改要比對數據庫進行多次保存要好得多。但是你不想爲了節省成本而扭曲節奏。 - 在規劃您的sw流量時請記住這個問題。