2009-06-16 3 views
3

Warum wird die folgenden Schienen AnweisungRails Activerecord :: findet Join-Anweisung Ausgabe

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

in dieser Verschiebt (mit 2x dem gleichen beitreten)

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') 

Einfach nur neugierig.

Antwort

0

Ich sehe nicht die doppelte Join, ich sehe Schienen versuchen, Namenskonventionen zu verwenden, um roles_users und Benutzer zu verbinden, was zu Schienen führt, die nach der Tabelle roles_users_users suchen.

weil Sie eine Beziehung im Modell zwischen Benutzer und Rollen haben müssen Sie nicht angeben Verbindungs ​​roles_users

+0

Vergessen zu erwähnen, dass dies keine * .. * viele-zu-viele Beziehungstabelle ist, sondern ein echtes Modell auf eigene Faust mit 1 Benutzer und Zugehörigkeit zu 1 Rolle – user62605

0

Ich habe keine Ahnung, warum es so viel SQL-Code erzeugt. Müsste mehr Code von Ihrem Modell sehen. So etwas wie dies vielleicht weniger Code/komplex und optimierte SQL-Code erzeugen:

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

Ich brauche nicht zu roles_users anschließen, weil das Plugin bereits, dass einmal tun ...

Dank für Ihre Hilfe .

Verwandte Themen