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つのループを置くことを呼び出すための方法がなければならないと確信しているが、私はちょうど..おかげで、このいずれかを把握することはできません。
感謝を!ここに私の変更されたコードがあります: '' 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
Rubyの規約では、1行ブロックには{}を使用し、複数行ブロックにはdo..endを使用します。 – lorefnon
あなたのコードでは、 'puts" Address:#{apartment.address} "を内側ループの外側に移動し、' address_printed'チェックを取り除くことができます。 – lorefnon