Duplo juntar com habtm em ActiveRecord
-
05-07-2019 - |
Pergunta
Eu tenho uma situação estranha envolvendo a necessidade de participar de um duplo interior. Eu tentei a necessidade de consulta I, eu só não sei como fazer trilhos fazê-lo.
O Data ??strong>
- Conta (has_many: Locais)
- Site (HABTM: usuários, belongs_to: conta)
- Usuário (HABTM: Locais)
Ignorar que eles são habtm ou qualquer outra coisa, eu posso fazê-los habtm ou has_many:. Através
Eu quero ser capaz de fazer
@user.accounts
ou
@account.users
Então é claro que eu deveria ser capaz de fazer
@user.accounts < @some_other_account
E, em seguida, ter @ user.sites incluem todos os sites de @some_other_account.
Eu brincava com habtm e has_many:. Através mas não pode obtê-lo para fazer o que quero
Basicamente eu preciso para acabar com uma consulta como esta (copiado do phpmyadmin testado e funciona.):
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
Posso fazer isso? Será que é mesmo uma boa idéia ter esse duplo participar? Estou assumindo que iria funcionar melhor se os usuários tinham a associação com contas para começar, e depois se preocupar em obter @ user.sites vez, mas funciona melhor para muitas outras coisas, se for mantido do jeito que está (usuários <-> sites).
Solução
Eu acho que é melhor para criar métodos personalizados para esta em vez de tentar sapato Horn-lo em uma associação. Por exemplo.
# 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
Não testado, mas que deve funcionar para qualquer um HABTM ou associação has_many :through
. Existem algumas otimizações que você pode fazer com a consulta, dependendo da abordagem que você ir com ele.
Um dia nós pode obter suporte para has_many :through
profundamente aninhada que iria lidar com um pouco isso.
Outras dicas
Isto pode ser útil para você (Rails 2.x)