Rails ActiveRecord :: find Оператор соединения - PullRequest
3 голосов
/ 16 июня 2009

Почему следующее заявление рельсов

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

Просто любопытно.

Ответы [ 3 ]

1 голос
/ 18 июня 2009

Мне не нужно было присоединяться к role_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
0 голосов
/ 17 июня 2009

Я понятия не имею, почему это привело бы к такому количеству кода 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 }})
0 голосов
/ 16 июня 2009

Я не вижу дублирующего соединения, я вижу рельсы, пытающиеся использовать соглашения об именах для объединения ролей_пользователей и пользователей, в результате чего рельсы ищут таблицу role_users_users.

потому что в вашей модели есть связь между пользователями и ролями, вам не нужно указывать присоединение role_users

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...