2010-11-08 32 views
0

Je suis assez nouveau à Rails, alors ne me tuez pas si cette question stupide = PComment filtrer de plus de 1 association HABTM

je les modèles suivants:

class Profile < ActiveRecord::Base 
has_and_belongs_to_many :sectors 
has_and_belongs_to_many :languages 

class Sector < ActiveRecord::Base 
    has_and_belongs_to_many :profiles 
end 

class Language < ActiveRecord::Base 
    has_and_belongs_to_many :profiles 
end 

Je suis à la recherche d'une manière élégante (sans écrire sql joint ou quoi que ce soit, si possible) pour obtenir tous les profils qui ont un secteur particulier et une langue particulière.

J'ai googlé, mais tout ce que je pouvais trouver comment faire pour 1 HABTM, mais j'ai besoin pour 2.

Tout ce que j'ai est le suivant:

def some_method(sector_id, language_id) 
    Sector.find(sector_id).profiles 
end 

mais je ne Ne sais pas alors comment ajouter le filtre par language_id sans se tromper avec les conditions de jointures ou écrire sql, et bien sûr, tout en une requête ... Y at-il une façon propre/élégante de faire cela?

Merci!

+0

Est-il vraiment un moyen "rails" pour le faire? Ou suis-je juste en train de rêver? = P .... S'il vous plaît dites-moi s'il n'y a pas et je vais utiliser normal: se joindre et d'autres choses. – emzero

Répondre

1

Dans votre exemple ci-dessus, vous avez déjà généré 2 requêtes SQL,

  1. premier Sector.find (#id) (sélectionnez le secteurs table pour obtenir enregistrement avec id == #id)

  2. deuxième .profiles (sélectionnez les profils table pour obtenir tous les profils avec suivants secteur - dans cette sélection vous avez déjà jointure interne profiles_selectors sur profils _selectors.profile_id = profiles.id généré automatiquement par des rails)

J'espère que c'est ce que vous cherchez: (mais je l'utilise: Relie clé)

class Profile < ActiveRecord::Base 
    has_and_belongs_to_many :sectors 
    has_and_belongs_to_many :languages 

    def self.some_method(language_id, sector_id) 
    all(:conditions => ["languages.id = ? and sectors.id = ?", language_id, sector_id], :joins => [:languages, :sectors]) 
    end 
end 

Résultat de cette méthode est Requête de 1 sql et vous obtenez des profils filtrés par langue et secteur.

Meilleures salutations

Mateusz Juraszek

+0

Assez propre bien qu'il utilise: jointures, devinez c'est comme ça que c'est fait. Merci =) – emzero

1

Essayez ceci:

Profile.all(:joins => [:sectors, :languages], 
    :conditions => ["sectors.id = ? AND languages.id ?", sector_id, language_id])