Как я могу вызвать include (левое соединение), если включаемая модель не связана напрямую с базовой моделью? - PullRequest
0 голосов
/ 25 ноября 2011

Есть три модели, к которым я хочу присоединиться: бронирование, суб-заказ и клиент.Бронирование имеет_ множество подпунктов, которые также принадлежат (и могут не принадлежать) клиенту.Я хочу перечислить все заказы по заказу client.name.Мне нужно объединение при бронировании и субхокинге, а также отношения между бронированием и клиентом.Я попробовал следующее, и это не сработало.

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

1 Ответ

0 голосов
/ 25 ноября 2011

Я думаю, что в вашем коде есть опечатка. Я создал приложение, которое вы описали в своем вопросе, и попробовал несколько простых запросов. Затем я попробовал ваш пример запроса в первой строке в выводе ниже.

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 `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
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 здесь . Дайте мне знать, если у вас есть еще вопросы.

С уважением, Девин М

...