3

У меня странная ситуация, связанная с необходимостью двойного внутреннего соединения. Я попробовал запрос, который мне нужен, я просто не знаю, как сделать рельсы.Двойное соединение с habtm в ActiveRecord

Паспорта

  • счета (has_many: сайты)
  • сайта (HABTM: пользователи, belongs_to: счет)
  • пользователя (HABTM: сайты)

Игнорирование что они habtm или что-то еще, я могу сделать их habtm или has_many: через.

Я хочу быть в состоянии сделать

@user.accounts 

или

@account.users 

Тогда, конечно, я должен быть в состоянии сделать

@user.accounts < @some_other_account 

А затем @ user.sites включают все сайты из @some_other_account.

Я возился с habtm и has_many: через, но не могу заставить его делать то, что я хочу.

В принципе мне нужно закончить с запросом, как это (копируется из PHPMyAdmin Протестировано и работает.):

SELECT accounts.* 
FROM accounts 
INNER JOIN sites ON sites.account_id = accounts.id 
INNER JOIN user_sites ON sites.id = user_sites.site_id 
WHERE user_sites.user_id = 2 

Могу ли я сделать это? Это даже хорошая идея, чтобы иметь это двойное соединение? Я предполагаю, что это будет работать лучше, если бы пользователи имели связь с учетными записями для начала, а затем беспокоиться о получении @ user.sites вместо этого, но он работает лучше для многих других вещей, если он поддерживается так, как он есть (пользователи < -> места).

ответ

3

Я думаю, что лучше создать собственные методы для этого, а не пытаться обучать его в ассоциации. Например.

# in user.rb 
def accounts 
    Account.all(:include => {:sites => :users}, :conditions => ["users.id=?", self]) 
end 

def add_account(other_account) 
    other_account.sites.each do |site| 
    self.sites << site 
    end 
end 

# in account.rb 
def users 
    User.all(:include => {:sites => :account}, :conditions => ["accounts.id=?", self]) 
end 

непроверенная, но это должно работать либо HABTM или has_many :through ассоциации. Есть несколько оптимизаций, которые вы можете сделать с запросом в зависимости от того, с каким подходом вы идете.

Когда-нибудь мы получим поддержку глубоко вложенных has_many :through, которые будут обрабатывать некоторые из этих данных.

+0

Спасибо! Любите скринкасты кстати. –