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")
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