При переносе нашего приложения rails2 на rails3 мы обнаружили (еще одну!) Тонкую разницу. Лично мне кажется, что sql, генерируемый объединениями, неверен.
Учитывая модель, которая выглядит следующим образом:
class Event < ActiveRecord::Base
has_many :event_event_categories
has_many :locations, :class_name => "LocationCategory", :through => :event_event_categories, :source => :event_category, :uniq => true
...
end
мы делаем несколько областей, которые должны использовать местоположения для некоторых столбцов. Но запросы в Rails 2 слегка отличаются от rails 3
Рельсы 2:
ree-1.8.7-2011.03 :037 > Event.joins(:locations).to_sql
=> "SELECT `events`.* FROM `events`
INNER JOIN `event_event_categories` ON (`events`.`id` = `event_event_categories`.`event_id`)
INNER JOIN `event_categories` ON (`event_categories`.`id` = `event_event_categories`.`event_category_id`) AND (`event_categories`.`type` = 'LocationCategory' ) "
Рельсы 3:
ree-1.8.7-2011.03 :037 > Event.joins(:locations).to_sql
=> "SELECT `events`.* FROM `events`
INNER JOIN `event_event_categories` ON `events`.`id` = `event_event_categories`.`event_id`
INNER JOIN `event_categories` ON `event_categories`.`type` = 'LocationCategory'"
Это не положить
(`event_categories`.`id` = `event_event_categories`.`event_category_id`)
в sql.
Почему это?