У меня есть модель, которую я использую для отслеживания разрешений в иерархической организации с помощью плагина awesome_nested_set
. Я сталкиваюсь с проблемой, когда два named_scope
s, при соединении вместе, создают дублирование INNER JOIN
.
class Group < ActiveRecord::Base
acts_as_nested_set
has_many :memberships
has_many :accounts, :through => :memberships
has_many :authorizations
has_many :users, :through => :authorizations
end
Два named_scope
расположены в модели Account
и используются для фильтрации учетных записей по пользователю и группе:
named_scope :in_group, lambda { |id|
group_ids = Group.find(id).self_and_descendants.collect(&:id)
{ :joins => :memberships, :conditions => ["memberships.group_id in (?)", group_ids] }
}
named_scope :for, lambda { |user|
groups = user.authorizations.groups.collect(&:id) unless user.admin?
user.admin ? {} : { :joins => :groups, :conditions => ["groups.id IN (?)", groups] }
}
Оба эти named_scope
должны присоединиться к memberships
, но разве они не смогут сделать это без дублирования? Когда они связаны друг с другом, mysql взрывается со следующей ошибкой:
Mysql::Error: Not unique table/alias: 'memberships': SELECT `accounts`.* FROM `accounts` INNER JOIN `memberships` ON accounts.id = memberships.account_id INNER JOIN `memberships` ON `accounts`.`id` = `memberships`.`account_id` INNER JOIN `groups` ON `groups`.`id` = `memberships`.`group_id` WHERE ((memberships.group_id in (54,94)) AND (groups.id IN (54,94))) ORDER BY business_name, location_name LIMIT 0, 75