2012-01-18 4 views
0

2つのモデルHorseとRaceがあります。新しいRails 3クエリインターフェイスを使用してjoinsテーブルの情報を表示する方法

class Horse < ActiveRecord::Base 
has_many :races 
end 

class Race < ActiveRecord::Base 
belongs_to :horse 
end 

ここで、馬の名前とすべてのレースを確認するために、新しいレール3クエリインターフェイスを使用します。

Horse.joins(:races) # I get an active record relation that only displays horse data 

Horse.joins(:races).count #Yields 31 the exact number of races. 

Horse.joins(:races).all #Yields an Array of 31 Horse, but no race data 

Horse.joins(:races).all.select("horses.*, starters.*") #Yields active record relation with only Horse data. 

質問1:完全な馬とのレースレコードを生成する正しいクエリは何ですか。

質問2:馬の名前とすべてのレースレコードを得る正しいクエリとは何ですか?

私はこれが非常に基本的だと知っていますが、私は困惑しています。私はその関係に間違ったことをしていると感じています。

答えて

1

私が見ることができるから、あなたはあなたの関係に何か悪いことをしているわけではありません。

あなたは自分のレースのそれぞれとすべての馬を見たい場合:

Horse.includes(:races).each do |horse| 
    puts horse.name 
    horse.races.each do |race| 
    puts race.name 
    end 
end 

は、私はあなたの質問を理解すると仮定すると、joins(:races)の使用がここには無関係です。まず、レーステーブルからデータを自動的に取得しません。馬とレースの間にインナージョイントを追加するだけです。馬Nが10レースの場合、そのクエリは馬Nの10個のインスタンスを返します。このインスタンスはおそらくこのインスタンスでは役に立たないでしょう。

上記includes(:races)は厳密には必要ではない - Nクエリ(N馬の数である)とは対照的に、それはただ一つのクエリで一度にすべての人種をロードします。ちょうど時間とリソースを節約します。

+0

返信いただきありがとうございます。だからブロックとputsが必要です。私はIRBでこれを1本(2本)のライナーで達成できると思った。たとえば、Horse.includes(race).select( "horses。*、race。*")。おそらくそうではありません。再度、感謝します。 – Mutuelinvestor

+0

ブロックとputsは必ずしも必要ではありません。それは私が入力したばかりのやり方です。確かに1ライナーで達成可能です。 'stuff = Horse.each {| h | "#{h.name}:#{h.races.map(&:name).join( '、')}"} 'も動作します。 – bioneuralnet

関連する問題