2010-11-27 5 views
3

は私がUserモデル、belongs_to :userTaskモデル、:has_one :eventを持っていると言う、completedブール属性、およびタスクが完了したときに作成され、またbelongs_to :eventEventモデルを持っています。私は最初の方法は思えますが代わりにアソシエーションのIDを直接使用する必要がある場合はいつですか?

# 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)

を書くことができていることに気付きましたTaskObserver

最も正しいのは、後者のバリエーションのいずれかを使用する利点ですか?

答えて

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をロードすることがわかります。 にキャッシュされていても、参照をコピーするだけで実際のオブジェクトを処理する理由はわかりません。

一般的に、以前はオブジェクトを使用したときにはオブジェクトを使用し、使用しないときはIDを使用することをお勧めします。

2

Railsでは、関連付けはどちらにでも割り当てることができますが、どちらも「正しい」または「間違っていません」ということはフレームワークの性質に過ぎません。モデルにはuser_iduserの両方のセッターメソッドがあります。そのため、いずれかの違いを気にせずに使用できます。

あなたがイベントを作成する方法は、私にとって少し奇妙に思えます。タスクがbelongs_toイベントになるのは本当に奇妙なようですが、イベントはタスクが完了したときにのみ作成されます。それが実際にどのように機能していますか? task.user.id場合がいたことに、おそらくパフォーマンスの考慮...

、ユーザーではない場合 -

+0

これは実際の動作です。あなたはhas_oneがもっと適切だと思いますか? –

2

Beerlingtonが言ったように - ここには「右」か「間違っている」がありませんeager-loaded、あなたはデータベースへの往復をしています。 task.user_id場合には、あなたは注意

  • ....往復することを行っていない - Railsはあなただけの組合離れIDをつかんでいるなら、それだけでタスクを使用することができることに気づくのに十分な、おそらくスマートです.user_id - しかし、私はこれを確認するのに尽力していません。開発ログと比較して調べるのに十分なのでしょうか。
関連する問題