Lors de la migration de notre application rails2 vers rails3, nous avons rencontré (une autre!) Différence subtile. Personnellement, il me semble que le sql généré par les jointures est faux.différence dans Rails 3 jointures vs Rails 2
contient un modèle qui ressemble à ceci:
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
nous faisons des champs d'application qui ont besoin d'utiliser des emplacements pour certaines colonnes. Mais les requêtes sont subtilement différents dans Rails 2 vs rails 3
Rails 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') "
Rails 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'"
Il ne met pas la
(`event_categories`.`id` = `event_event_categories`.`event_category_id`)
dans la sql.
Pourquoi est-ce?
Rails 2 devrait ressembler 'Event.all (: Relie =>: emplacements)', hmm? et il n'y a pas de méthode 'to_sql' aussi – fl00r
désolé - J'utilise la gemme fake_arel pour obtenir ce genre de choses. – phil