2012-03-17 14 views
1

私のビューに渡されるインスタンス変数を作成しています。この変数 'post'にはuser_idが関連付けられており、 'username'という追加の属性を追加したいので、それを渡してビューで使用することもできます。Railsのインスタンス変数へのパラメータの追加

ここに私がしたいことの例があります。

@post = Post.find(params[:id]) 
@post.username = User.find(@post.user_id).username 

私のユーザーモデルにusername列は存在しますが、私のSongモデルには存在しません。だから、私は、私はちょうど全く新しいインスタンス変数を作成し、そこにその情報を置くことができます知っている

@post.username 

を使用せませんが、私は一つの変数で、素晴らしく、きちんとすべてを維持したいと思います。私のjsonがコードをよりきれいに見せるようにします。

私はこれをどのように達成することができますか?

ありがとうございます!

答えて

4

Postモデルにuser_idが存在することに基づいて、すでにユーザ名を取得できるアソシエーションが設定されている可能性があります。それはおそらく、単純に既存の関連付けを使用する手間を大幅に節約します:

@post = Post.find(params[:id]) 
username = @post.user.username 

あなたはインデックスページで、例えば(一度に複数のポストを照会される可能性が高いなら、Railsのを伝えるために.includesを呼び出します熱心な負荷に関連はあなたがthe N+1 problemを防ぐことができます:

最後に
@posts = Post.includes(:user).all 

は、あなたのJSON出力に関連するレコードが含まれるように、あなたがシリアライズとして:includeパラメータを渡す:

# in controller 
render :json => @post.to_json(:include => :user) 

This questionには、シリアライズオプションのより包括的な説明が含まれています。読書の価値がある。

+0

感謝を渡すことができますが、私はこの関連性について知りませんでした。とにかくページのJSON出力にユーザー名情報を追加するにはどうしますか? – Dan

+0

はい。私の回答を更新します – rjz

+1

それは別の問題です、どのようにJSONにレンダリングしていますか?デフォルトを使用している場合は、to_json呼び出しにオプションを渡します。例えば。レンダリング:json => @ post.to_json(:include =>:user)または、Post JSONオブジェクトがあなたのアプリケーションのどこにいてもユーザ名を持つようにするには、Postモデルで 'as_json'メソッドをカスタマイズします。 –

2

別のインスタンス変数を渡す必要はありません。 1. @post.user.usernameはビュー自体に使用できます。 2.それとも、ヘルパーを作成し、@post.user

def username user 
user.username 
end 
+0

ya @ post.user.usernameは正常に機能しました。しかし、私のjson出力にはまだuser_id =#があります。とにかくページのjson出力にユーザ名を追加することもできますか? – Dan

+0

jsonを@ post.to_json(:include =>:user) – asitmoharna

+0

としてレンダリングしている間にユーザーを追加する必要があります。このソリューションは、asitmoharnaに感謝しています。早速のお返事ありがとうございます – Dan

関連する問題