3

J'ai une situation étrange impliquant le besoin d'une jointure interne double. J'ai essayé la requête dont j'ai besoin, je ne sais pas comment faire des rails.Double jointure avec habtm dans ActiveRecord

Les données

  • compte (has_many: Sites)
  • Site (HABTM: utilisateurs, belongs_to: compte)
  • utilisateur (HABTM: Sites)

Ignore que ils sont habtm ou peu importe, je peux les faire habtm ou has_many: à travers.

Je veux être capable de faire

@user.accounts 

ou

@account.users 

Alors bien sûr, je devrais pouvoir faire

@user.accounts < @some_other_account 

Et ont ensuite @ user.sites comprennent tous les sites de @some_other_account. J'ai tripoté avec habtm et has_many: à travers mais je ne peux pas l'obtenir pour faire ce que je veux.

Fondamentalement, je dois finir avec une requête comme celui-ci (copié à partir phpmyadmin testé et fonctionne.):

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 

Puis-je faire cela? Est-ce même une bonne idée d'avoir cette double jointure? Je suppose que cela fonctionnerait mieux si les utilisateurs avaient l'association avec les comptes pour commencer, et ensuite s'inquiéter d'obtenir @ user.sites à la place, mais cela fonctionne mieux pour beaucoup d'autres choses si elle est maintenue comme elle est (utilisateurs < -> des sites).

Répondre

3

Je pense qu'il est préférable de créer des méthodes personnalisées pour cela plutôt que d'essayer de le cogner dans une association. Par exemple.

# 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 

Untested, mais qui devrait fonctionner soit pour un HABTM ou has_many :through association. Vous pouvez effectuer certaines optimisations avec la requête en fonction de l'approche choisie. Un jour, nous pourrions obtenir un support pour has_many :through profondément imbriqué qui pourrait gérer une partie de cela.

+0

Merci! J'adore les screencasts btw. –

Questions connexes