2009-11-16 9 views
1

J'ai la configuration de situation suivante pour modéliser un client avec plusieurs adresses et une table de référence pour le type d'adresse. Le modèle de données est Customer - Address: relation many to many, représentée par une table de jointure appelée «Location».
LocationType - Location: un à plusieurs, de sorte qu'un type d'emplacement (par exemple 'work', 'home') peut avoir plusieurs associations à un emplacement. Ce que j'essaye de réaliser est la capacité de localiser simplement toutes les adresses de «travail» pour un client, ou les adresses de «livraison». Tout en évitant d'avoir le texte en double dans la table de jointure LocalisationUtilisation de modèles imbriqués many-to-many dans Rails

Le modèle (s) ressembler à:

class Address < ActiveRecord::Base 
    has_many :locations 
    has_many :customers, :through => :locations 
end 

class Customer < ActiveRecord::Base 
    has_many :locations 
    has_many :addresses, :through => :locations do 
    def special_location(loc) 
     find :all, :conditions => ['addr_type == ?', loc] 
    end 
    end 
end 

class Location < ActiveRecord::Base 
    belongs_to :address 
    belongs_to :customer 
    belongs_to :locationtype 
end 

class LocationType < ActiveRecord::Base 
    has_many :locations 
end 

Cela fonctionne bien pour les simples cas de:

@customer = Customer.find(1) 
@customer.addresses # return all addresses 

Et avec le ' méthode d'aide spéciale 'of special_location ("chaîne") Je peux atteindre le résultat. Ce que je voulais savoir comment je pouvais obtenir le même par l'utilisation de la table de référence supplémentaire (LocationType)
Quelque chose le long des lignes de

@customer.addresses.find_locationtype("work") 
+0

J'ai négligé la relation un-à-plusieurs des adresses aux emplacements. La solution de Damien MATHIEU est plus proche de ce qui doit être fait. – EmFi

Répondre

1

Vous pouvez ajouter des tables à joindre à la demande de sélection .

def find_locationtype(type) 
    find :all, :conditions => ['location_types.name = ?', type], :joins => :location, :locationtype 
end 

Lorsque vous faites customer.find_locationtype('work'), la requête générée rejoindra les tables location et locationtype. Vous aurez donc accès à tous les champs de ces deux tables et pourrez y ajouter des conditions.

+0

Cette méthode est-elle ajoutée au modèle ou au contrôleur? Il est logique de l'avoir sur le modèle, car c'est la source d'information demandée –

+1

Bien sûr, c'est dans le modèle. C'est logique;) –

Questions connexes