2009-06-16 7 views
3

Pourquoi l'instruction suivante railsRails ActiveRecord :: find JOIN question

User.find(:all, :joins => [:roles,:roles_users], 
      :conditions => { :roles => { :name => 'subscriber', 
             :authorizable_id => self.id, 
             :authorizable_type => self.class.to_s }}) 

dans ce Traduit (avec 2x le même rejoindre)

SELECT "users".* FROM "users" 
    JOIN "roles_users" ON ("users"."id" = "roles_users"."user_id") 
    JOIN "roles" ON ("roles"."id" = "roles_users"."role_id") 
    JOIN "roles_users" roles_users_users ON roles_users_users.user_id = users.id 
    WHERE ("roles"."authorizable_id" = 4 AND "roles"."name" = 'subscriber' AND "roles"."authorizable_type" = 'Howto') 

curiosité.

Répondre

0

Je ne vois pas la jointure en double, je vois des rails essayant d'utiliser des conventions de dénomination pour rejoindre les rôles_users et les utilisateurs résultant en rails recherchant la table roles_users_users.

parce que vous avez une relation dans votre modèle entre les utilisateurs et les rôles que vous ne devez pas spécifier la connexion roles_users

+0

Oublié de mentionner que ce n'est pas un * .. * beaucoup à beaucoup de table de relation, mais un vrai modèle lui-même ayant 1 utilisateur et appartenant à 1 rôle – user62605

0

Je ne sais pas pourquoi il produirait beaucoup de code SQL. Aurait besoin de voir plus de code de votre modèle. Quelque chose comme cela pourrait être moins de code/complexe et qu'elle code SQL optimisé:

class Server < ActiveRecord::Base 
    has_and_belongs_to_many :roles, :join_table => :roles_users 
end 

User.all(:include => :roles, :conditions => {:roles => { :names => 'subscriber', :authorizable_id => self.id, :authorizable_type => self.class.to_s }}) 
1

Je n'ai pas besoin de se joindre à roles_users parce que le plugin faisait déjà qu'une fois ...

Merci pour votre aide .

has_many :users, :finder_sql => 'SELECT DISTINCT users.* FROM users INNER JOIN roles_users ON user_id = users.id INNER JOIN roles ON roles.id = role_id WHERE authorizable_type = \'#{self.class.base_class.to_s}\' AND authorizable_id = #{id}', :counter_sql => 'SELECT COUNT(DISTINCT users.id) FROM users INNER JOIN roles_users ON user_id = users.id INNER JOIN roles ON roles.id = role_id WHERE authorizable_type = \'#{self.class.base_class.to_s}\' AND authorizable_id = #{id}', :readonly => true 
Questions connexes