Question

J'ai une situation étrange impliquant le besoin d'une double jointure interne. J'ai essayé la requête dont j'ai besoin, je ne sais tout simplement pas comment faire en sorte que les rails le fassent.

Les données

  • Compte (has_many: sites)
  • Site (habtm: utilisateurs, appartient_à: compte)
  • utilisateur (habtm: sites)

Ignorer qu'ils sont habtm ou autre chose, je peux leur faire habtm ou has_many: à travers.

Je veux pouvoir faire

@user.accounts

ou

@account.users

Alors bien sûr, je devrais pouvoir faire

@user.accounts < @some_other_account

Ensuite, @ user.sites inclut tous les sites de @some_other_account.

J'ai tripoté habtm et has_many: je ne parviens pas à le faire, mais je ne peux pas le faire. "

En gros, il me faut une requête comme celle-ci (copiée à partir de phpmyadmin. Testée et qui 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 d’abord une association avec des comptes, puis s’inquiétaient d’obtenir @ user.sites à la place, mais cela fonctionnait mieux pour beaucoup d’autres choses s’il était conservé tel quel (utilisateurs < - > sites).

Était-ce utile?

La solution

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 transformer en 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

Non testé, mais cela devrait fonctionner pour une association HABTM ou has_many :through. La requête permet d’optimiser certaines requêtes en fonction de l’approche choisie.

Nous aurons peut-être un jour un support pour les <=> imbriqués profonds, qui gèreraient une partie de ces problèmes.

Autres conseils

Cela pourrait vous être utile (Rails 2.x)

http://github.com/ianwhite/nested_has_many_through

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top