2016-05-03 4 views
0

このような些細な質問を投稿しても大変申し訳なく思っていますが、Ruby on Railsの新機能のためにGoogleが助けにならなかったのです。結合で正しいクエリを作成する

私は2つのテーブルがあります。

ID:整数
名:文字列

住所
ID:整数
PERSON_ID:整数
名:文字列

をを検索したいはAddressと結合されています。このコードスニペットの作品が、この人のために利用可能なアドレス実際にある場合のみ:

@person = Person.where('person.id' => params[:id]) 
       .joins(:address) 
       .select('person.id as id, address.id as aid, person.name as name, address.name as aname').first 

マイビュー:

<h2><%= @person.name %></h2> 
<p><%= @person.aname %></p> 

は、たぶん私は、mは何か概念間違っているのでは。 Personに関連するAddressがあるとすぐに私の意見が表示され、そうでない場合はAddressが表示され、エラーが表示されます。

+0

エラーは何ですか? – Pavan

答えて

2

.includes(:relation)メソッドを使用してLEFT OUTER JOINクエリを生成することを検討してください。また、.find(:id)メソッドを使用して、特定の主キーを持つ人物を探すことを検討してください。これにより、クエリが簡単になります。

@person = Person.find(params[:id]).includes(:address) 

また、あなたはこのようなあなたのビュー内のアドレスフィールドを呼び出したいことがあります。

<h2><%= @person.name %></h2> 
<p><%= @person.address.try(:name) %></p> 

注:アドレス(@person.address.name)に名前を呼び出すには、Law of Demeterに違反すると、あなたは追加することを検討すべきですPersonクラスへのaddress_nameメソッドレールでは、delegates :x, to: :y構文を使用できます。

+0

これはもう少しだと思いますが、あなたの返事に感謝します。しかし、私はまだいくつかの問題があります。私が '<%= @ person.address%>'を実行すると、そこに(* raw_attributes *の)値にいくつかの属性があることがわかりますが、 '%% @ person.address.name% > 'エラーが表示されます:#

Sylnois

+0

'has_one'または' has_many'関連がありますか?それは後のように見えます。あなたはただ1つではなく、アドレスのリストを取得しています。 'has_many:addresses'を' has_one:address'に変更してください。 – Uzbekjon

+0

私はそれを手に入れました!私は '@ person.address'をループする必要がありました。私はクエリを定義したいので、ループを取り除く可能性はありますか?それは私の1つのアドレスを取得するだけです(アドレスにactiveというブール値フラグを追加して、1つのアドレスだけがアクティブになります)。 – Sylnois

関連する問題