2009-09-09 13 views
2

Je travaille sur mon premier projet avec RoR et j'ai besoin de créer plusieurs à plusieurs relations entre deux modèles mais avec la possibilité de commander des objets du premier modèle en association avec le deuxième modèle.Commander le premier modèle en association avec le second modèle

Disons que j'ai deux modèles suivants - Client - Route

Je veux attribuer beaucoup de clients à de nombreux itinéraires, mais avec le stockage afin de cette association, donc par exemple

-Route 1 
--Customer 2, position 1 
--Customer 1, position 2 

-Route 2 
--Customer 3, position 1 
--Customer 1, position 2 

Je pense Je dois utiliser pour cela has_many: through et belong_to et créer un champ "position" dans in-middle-table mais ensuite comment rendre ce champ accessible et modifiable?

Répondre

3

Vous pouvez aller avec :through:

class Route < ActiveRecord::Base 
    has_many :bookings 
    has_many :routes, :through => bookings 
end 

class Booking < ActiveRecord::Base 
    belongs_to :route 
    belongs_to :customer 
end 

class Customer < ActiveRecord::Base 
    has_many :bookings 
    has_many :routes, through => :bookings 
end 

Votre modèle réservations garderait la date/position et vous pouvez y accéder avec:

c = Customer.first 
c.routes(:include => :bookings, :order => "bookings.position") 
+0

Comment opéreriez-vous alors sur ce champ de position? Serait-il également attribué au client? – Inez

+0

Pour une réservation donnée: c = Customer.first b = c.bookings.first b.position Mais le code ci-dessus renvoie les routes déjà en ordre, vous pouvez simplement passer à une partielle (ou boucle sur le résultat défini dans un contrôleur). – cite

1
class Customer < ActiveRecord::Base 
    has_many :routes, :through => :trips 
    ... 
end 

class Trip < ActiveRecord::Base 
    belongs_to :customer 
    belongs_to :route 
    // has a ordinal called 'seq' 
    ... 
end 

class Route < ActiveRecord::Base 
    has_many :customers, :through => :trips 
    ... 
end 

Vous devriez être en mesure d'accéder à la champ ordinale via @ customer.routes [0] .seq Je ne l'ai pas testé et mes compétences de rails sont longues mais vous devriez avoir l'idée.

0

La solution de cite est juste. pour accéder à la table du milieu, essayez:

c.bookings # this will return the 'middle table' which then you have the access to the positions 
c.bookings.first.position 
0

Je veux afficher tous les clients assignes à un parcours, de sorte que la requête envoyée à la base de données sont:

SELECT customers * FROM customers INNER JOIN bookings SUR customers.. id = bookings .customer_id OÙ ((bookings .route_id = 1))

puis

SELECT bookings. * FROM bookings OERE (bookings .customer_id IN (1,2,3))

..so, la 2ème requête ne contient pas assez d'informations dans WHERE calus, car elle sélectionne des informations pour toutes les routes pour des clients spécifiques, pas seulement sur des clients pour un itinéraire spécifique (id = 1).

.. Est-ce que RoR effectue un filtrage supplémentaire après avoir récupéré ces données?

btw. J'ai: include =>: réservations ajoutées au modèle de route

+0

mais la première requête fonctionne correctement? la seconde interroge la requête supplémentaire pour pré-charger toutes les réservations, parce que vous avez 'inlcude' dans votre modèle de Route. 'Inclure' indique aux rails de charger toutes les réservations liées à la première requête, au cas où vous en auriez besoin dans le futur. –

+0

oui, mais alors il n'y a pas d'association entre un client spécifique et un enregistrement spécifique dans les réservations, liées à cet utilisateur et cette route, donc je ne suis pas en mesure d'obtenir la position – Inez

Questions connexes