2016-10-01 5 views
2

RubyとActiver Recordを初めて使用しましたが、私はこの質問に苦労しています。各アパートメントオーバーRuby activerecord ActiveRecordを使用した2つのテーブルの外部結合

反復、各アパートの、それはアドレスのディスプレイと:へ

CREATE TABLE tenants(
    id serial PRIMARY KEY, 
    name varchar(50) NOT NULL, 
    age integer NOT NULL, 
    gender varchar(10) NOT NULL, 
    apartment_id integer NOT NULL 
); 

CREATE TABLE apartments(
    id serial PRIMARY KEY, 
    address varchar(50) NOT NULL, 
    monthly_rent decimal(12,2) NOT NULL, 
    sqft integer NOT NUlL, 
    num_beds integer NOT NULL, 
    num_baths integer NOT NULL 
); 

私が求められています質問は: 私は2つのテーブルを持っている:ここではテナントとアパートメント が定義されていますで、テナントBのa.id = b.apartment_idためのアパートから 選択a.address、b.name:それはすべて私がpsqlで行きましたテナント

だと、このクエリで答えを見つけることができます。住所;

私はアパート全体を繰り返してテナントを繰り返すことができますが、このように答えを見つけることはできますが、あまりにも恵まれていません。アドレスが一致しない場合は、内部ループ。ここでは、このコードは次のとおりです。

Apartment.find_each { |user| 
    puts "-Outer Address #{user.address}" 
    Tenant.find_each { | tenant| 
    puts "-inner Tennant #{tenant.name}" if tenant.apartment_id==user.id 
    } # tenant where 
} #apartment.find 

私は2つのループを置くことを呼び出すための方法がなければならないと確信しているが、私はちょうど..おかげで、このいずれかを把握することはできません。

答えて

0

あなたはそれらを介してincludeseager loadへの関連して、ループを使用することができます。

Apartment.includes(:tenants).find_each do |apartment| 
    apartment.tenants.each do |tenant| 
     # print tenant details 
    end 
end 
+0

感謝を!ここに私の変更されたコードがあります: '' Apartment.includes(:tenants).find_each do | apartment | address_printed = true apartment.tenants.each do | tenant | #印刷テナントの詳細 プット "住所:#{} apartment.address" 場合address_printed プット "テナント:#{} tenant.name" 私はあなたが使用して気づいた address_printed = falseを エンド end''はない} {終了しませんこれはスタイルの問題ですか? – merubin

+0

Rubyの規約では、1行ブロックには{}を使用し、複数行ブロックにはdo..endを使用します。 – lorefnon

+0

あなたのコードでは、 'puts" Address:#{apartment.address} "を内側ループの外側に移動し、' address_printed'チェックを取り除くことができます。 – lorefnon

関連する問題