2011-08-11 2 views
0

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?

+0

Rails 2 devrait ressembler 'Event.all (: Relie =>: emplacements)', hmm? et il n'y a pas de méthode 'to_sql' aussi – fl00r

+0

désolé - J'utilise la gemme fake_arel pour obtenir ce genre de choses. – phil

Répondre

0

En Rails3 vous pouvez utiliser des requêtes comme

@alternative_drugs = Claim.joins('left join drugs on claims.ndc = drugs.ndcupchri ').select('claims.id, claims.member_id, claims.ndc').where("claims.nabp in ('1','2')").group(:ndc).order('calculated_price asc').all