2009-06-16 53 views
3

爲什麼下面的鐵軌聲明的Rails的ActiveRecord ::發現加入語句問題

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

轉換成這(與2個相同的連接)

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

只是好奇。

回答

0

我沒有看到重複的加盟,我看到鐵軌試圖使用命名約定加盟roles_users並導致鐵軌尋找roles_users_users表的用戶。

,因爲你必須在用戶和角色之間模型的關係,你不必設定加入roles_users

+0

忘了提及這不是一個* .. *多對多的關係表,而是一個真正的模型,它擁有1個用戶並且屬於1個角色 – user62605 2009-06-18 00:52:04

0

我不知道爲什麼會產生這麼多的SQL代碼。需要從你的模型中看到更多的代碼。像這樣的東西可能是更少的代碼/複雜,產生最優化的SQL代碼:

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

我並不需要加入到roles_users因爲插件已經在做,一旦...

感謝您的幫助。

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