含まれるモデルがベースモデルに直接関連付けられていない場合、インクルード(左結合)を呼び出すにはどうすればよいですか?

私は、予約、サブブッキング、クライアントに参加したい3つのモデルがあります。予約はhas_many sub_bookingsで、予約はクライアントに属します(またそうでないかもしれません)。私は、client.nameによって順序付けされたすべてのsub_bookingsをリストしたいと思います。私は予約とサブフックに参加する必要があり、予約とクライアントの間には関係があります。私は次のことを試みたが、それは仕事をしなかった。

SubBooking.joins(:booking).includes(:booking=>:client).order('client.name')

モデルは以下の通りです

class Booking < ActiveRecord::Base
  belongs_to :client
  has_many :sub_bookings
  ...
end

class SubBooking < ActiveRecord::Base
  belongs_to :booking
  ...
end

class Client < ActiveRecord::Base
  has_many :bookings
  ...
end

より正確には、私が生成したいSQLは次のようなものです

SELECT * FROM sub_bookings 
INNER JOIN bookings ON bookings.id = sub_bookings.booking_id
LEFT JOIN Clients ON bookings.client_id = clients.id
ORDER BY client.name
0
それがうまくいかなかったとはどういう意味ですか?エラーメッセージが表示されましたか?
追加された 著者 Devin M,
私の答えを見て、私はあなたの問題に近いものを見つけたと思う。
追加された 著者 Devin M,
はい、長いエラーメッセージがありました。私はそれにアクセスできない私は私のマシンに戻ってすぐにそれを投稿します。
追加された 著者 cypher,

1 答え

あなたのコードに誤字があると思います。あなたの質問に記述したアプリケーションを作成し、簡単なクエリをいくつか試しました。次に、下の出力の1行目にあるサンプルクエリを試しました。

Loading development environment (Rails 3.1.3)
ruby-1.9.2-p290 :001 > SubBooking.joins(:booking).include(:booking=>:client).order('client.name').to_sql
NoMethodError:   SubBooking Load (0.1ms)  SELECT "sub_bookings".* FROM "sub_bookings" INNER JOIN "bookings" ON "bookings"."id" = "sub_bookings"."booking_id"
undefined method `include' for []:ActiveRecord::Relation
        from /home/devin/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.1.3/lib/active_record/relation.rb:459:in `method_missing'
        from (irb):1
        from /home/devin/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in `start'
        from /home/devin/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in `start'
        from /home/devin/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.3/lib/rails/commands.rb:40:in `'
        from script/rails:6:in `require'
        from script/rails:6:in `
' ruby-1.9.2-p290 :002 > SubBooking.joins(:booking).includes(:booking=>:client).order('client.name').to_sql => "SELECT \"sub_bookings\".* FROM \"sub_bookings\" INNER JOIN \"bookings\" ON \"bookings\".\"id\" = \"sub_bookings\".\"booking_id\" ORDER BY client.name" ruby-1.9.2-p290 :003 >

あなたが見ているように、あなたが見たかもしれない素晴らしいエラーがスローされます。単純にこの呼び出しを修正します:

SubBooking.joins(:booking).include(:booking=>:client).order('client.name') 

これに:

SubBooking.joins(:booking).includes(:booking=>:client).order('client.name')

エラーを解決します。

コードを見たい場合は、ここのGitHub でそのコードを使用しました。これ以上質問があれば教えてください。

よろしく、 デビンM

0
追加された
問題ありません、うまくいけばそれはあなたが直面していた問題です。あなたのマシンに戻ったときにそれがうまくいくかどうかを教えてください。
追加された 著者 Devin M,
うん、それを使用して、それがうまく動作する場合、2行目を参照してください。 LEFT JOINがないことは、ジョインを実行するデータやコードの問題がないことが原因であるかどうかはわかりません。
追加された 著者 Devin M,
タイプミスのDevinを申し訳なく思って、あなたがサンドボックスに置いてくれてありがとう
追加された 著者 cypher,
私が覚えているものからこれを書いて、正確なコードを貼り付けてコピーしていないので、私はこの種類のエラー(定義されていないメソッド `include ')を見たことがないと確信しています。私は確かに '含む'を使用した。あなたは 'includes'でそれをテストしましたか?私はRuby 1.8.7を使用しています。それは何か違いはありますか?
追加された 著者 cypher,
その奇妙なと私は驚いていますが、今の仕事は、非常に同じ行は、昨夜のコンソール上で動作しませんでした。 sub_bookings INNER JOIN 予約のサブブックの読み込み(34.3ms)SELECT book book book sub_bookings created_at created_at <'2011-11-25')ORDER BY sub_bookings.property_name asc、clients.name `code => '2011-09-25'および sub_bookings
追加された 著者 cypher,
とにかくデヴィンにありがとう。
追加された 著者 cypher,