2010-11-27 56 views
3

說我有一個User模型,Task模型belongs_to :user:has_one :event,有completed布爾屬性,當完成任務時創建的Event模型,也belongs_to :event什麼時候應該直接使用關聯ID?

TaskObserver我注意到,而不是

# app/controllers/task_observer.rb 
class TaskObserver < ActiveRecord::Observer 
def after_update(task) 
    def after_update 
    task.create_event(:user=>task.user) if task.completed? 
    end 
end 

我可以寫

task.create_event(:user_id=>task.user.id)

甚至

task.create_event(:user_id=>task.user_id)

雖然第一種方式似乎最正確的是,使用後面的任何一種變體是否有好處?

回答

1

在這個特定的情況下,我去了task.create_event(:user_id=>task.user_id)。通過運行:

$ rails c 
ruby-1.8.7-p299 > ActiveRecord::Base.logger = Logger.new(STDOUT) 
ruby-1.8.7-p299 > Task.where("user_id IS NOT NULL).user.id 
... 
User Load (1.2ms) SELECT `users`.* FROM `users` WHERE (`users`.`id` = 103) LIMIT 1 
=> 103 

你可以看到,Rails會從數據庫中實際加載User。即使它緩存,我不明白爲什麼我應該處理實際的對象,如果我只是複製參考。

所以一般情況下,我認爲最好在以前使用過它們的時候使用對象,當你沒有使用它們時不要使用對象。

2

在Rails中,可以指定關聯的方式,既不是「正確」也不是「錯誤」,它只是框架的本質。這些模型有user_iduser的setter方法,這就是爲什麼您可以使用而沒有任何明顯的差異。

雖然你創建活動的方式對我來說似乎有點奇怪。看起來很奇怪一個任務屬於事件,但事件只在任務完成時創建。這真的是它的工作原理嗎?

+0

這真的是它的工作原理。你認爲has_one更合適嗎? – 2010-11-29 05:46:11

2

正如Beerlington說 - 沒有「正確」或「錯」在這裏 - 也許是一個性能的考慮然而,要過...

在task.user.id情況下,如果用戶不急於加載,您正在往返數據庫;在task.user_id的情況下,你並沒有這樣做......

  • 注 - Rails可能足夠聰明,以注意到, .user_id - 但我並沒有竭盡全力來證實這一點。將很容易檢查發展。日誌....
相關問題