18-10-2009, 01:15 PM
Ça se fait de manière transparente :
Par défaut, Ruby on Rails fait du lazy loading, mais si tu veux charger d'un coup les données (par exemple pour charger en une seule fois des news et leurs commentaires, pour pas que le chargement à la volée fasse une requête par news pour choper les commentaires) :
Sephi-Chan
@map = Map.find(1) # Retourne un objet Map.
# SELECT *
# FROM `maps`
# WHERE (`maps`.`id` = 1)
# On récupère les territoires grâce à l'association has_many :territories.
@territories = @map.territories # Retourne un tableau d'objets Territory.
# SELECT *
# FROM `territories`
# WHERE (`territories`.map_id = 1)
# On récupère les territoires voisins du premier territoire.
# On a une relation many-to-many, on passe par un modèle de jointure (nommé Neighourhood).
@territories.first.neighbours
# SELECT `territories`.*
# FROM `territories`
# INNER JOIN `neighbourhoods` ON `territories`.id = `neighbourhoods`.neighbour_id
# WHERE ((`neighbourhoods`.territory_id = 2))
Par défaut, Ruby on Rails fait du lazy loading, mais si tu veux charger d'un coup les données (par exemple pour charger en une seule fois des news et leurs commentaires, pour pas que le chargement à la volée fasse une requête par news pour choper les commentaires) :
# On récupère la carte et ses territoires.
@map = Map.find(1, :include => :territories)
# Il fait deux requêtes, gentiment.
# SELECT *
# FROM `maps`
# WHERE (`maps`.`id` = 1)
#
# SELECT `territories`.*
# FROM `territories`
# WHERE (`territories`.map_id = 1)
# On récupère la carte, ses territoires puis les voisins de ces territoires (fiou !).
@map = Map.find(1, :include => { :territories => :neighbours })
# SELECT *
# FROM `maps`
# WHERE (`maps`.`id` = 1)
#
# SELECT `territories`.*
# FROM `territories`
# WHERE (`territories`.map_id = 1)
#
# SELECT `neighbourhoods`.*
# FROM `neighbourhoods`
# WHERE (`neighbourhoods`.territory_id IN (2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30))
#
# SELECT *
# FROM `territories`
# WHERE (`territories`.`id` IN (11,23,7,12,24,8,13,14,25,9,15,26,27,16,28,17,18,2,30,19,20,3,21,4,10,5))
Sephi-Chan