2016-04-19 5 views
0

Ruby on Railsの新機能で、メッセージボードのチュートリアルで、新しいメッセージが以下のように作成されたことが確認されました。Rails:現在のユーザーを使ってメッセージを作成する必要があるのはなぜですか?

私のポイントは、なぜ我々はcurrent_user.buildまたはcurrent_user.newを使用してメッセージを構築しなければならないのです

メッセージ・モデルでは、我々だけで、変数のuser_idを作成することができますし、(私はそのビルドが新しいの別名である読み)その中にcurrent_user.idを格納して、どのユーザがどのメッセージを作成したかを知ることができます。それがこれを行うと、論理的に、同じになるように

def new 
    @message = current_user.messages.build 
end 

def create 
    @message = current_user.messages.build(message_params) 
    if @message.save 
     redirect_to root_path 
    else 
     render 'new' 
    end 
end 
+0

メッセージモデルのスキーマを投稿します。その属性にuser_idという属性が含まれている必要があります。この属性には、作成ステートメントが自動的に設定されます。 –

+0

はい整数としてuser_idがあります。それで、Railは自動的に、UserがMessageのモデルであるため、user_idが存在する必要があるという規則に従っていますか? _idのように、規約に従っていますか? – Tahseen

+0

正確に。 user_idがテーブルにある場合、current_user.messages.buildを実行すると、user_idが自動的に入力されます。 –

答えて

2

この

@message = current_user.messages.build 

current_user.buildを使用しての背後にある理由が見えている何

@message = Message.new(:user_id => current_user.id) 

と1つの重要な例外を除けば、ほぼあります。すでにcurrent_userを定義し、そのオブジェクトに.messagesと呼んでいる場合、railsは関連付けられたメッセージを参照し、は効率を高めるためにをキャッシュするので、同じアクションでcurrent_user.messagesを再度実行すると、再度検索する必要はありません。 @message = Message.create(:user_id => current_user.id)を実行すると、データベース内の関連付けが行われましたが、メモリのcurrent_userオブジェクトは変更を知らないため、current_user.messagesを実行すると新しいメッセージが表示されない可能性があります。 current_user.messages.buildを行う一方

は、プロセス内のキャッシュされた関連付けを更新し、そう 意志 current_user.messagesは、新しいメッセージが含まれています。

+0

しかし、基本的にメッセージモデルに返信するコメントモデルがある状況はどうでしょうか。人々はメッセージを読んでそれに返信するのと同じように。この場合、私は@comment = message.comments.buildをこのように構築しますか? – Tahseen

+0

ただ一つの小さな加え: '呼び出しcurrent_user.messages.build'は、他のメッセージのために、データベースクエリをトリガしません。あなたが実際にメッセージを使用する場合、これは最初にそうあなたがそのようなコメントを構築できる(例えば、その上に、アレイのようなメソッドを呼び出す) – jack

+0

@Tahseenを行われます。私はその中で、その後@commernt = message.comments.buildのように構築する場合 –

0

current_user.messages.buildを使用している間、それは自動的にあなたが明示的user_idに合格する必要がありますMessage.newの場合にobject.Butためuser_idを割り当てます。例えばMessage.new(:user_id=>current_user.id)である。この2行の間に1つの重要な違いがあり

1

:最初の行で

current_user.messages.build 

Message.new(:user_id => current_user.id) 

は、あなただけの関係を構築し、どのようにあるか知っている必要はありませんキーが設定されます。ある日、それを多対多の関係に変更したい場合はどうなりますか?または条件を追加する場合は(例:deleted_at => nil) あなたの関係を設定する場所は、あなたのモデルの中にあります。あなたのモデルの以外の関係の詳細を参照する必要があるまれなケースのみが必要です。

+0

私はこれがおそらく慣習によって好まれている主な理由だと思います。 "(どちらも真実ですが、おそらく二次的です)。 –

関連する問題