Je développe une application web dont un module gère des fiches de
concessionnaires scooter.
Voici rapidement mon architecture :
fiche.rb :
has_many :categories
category.rb :
belongs_to :fiche
has_many :scooters
scooter.rb :
belongs_to :category
Je souhaiterai afficher 4 photos de scooters (colonne image dans scooters) aléatoirement selon une fiche scooter spécifique (j’ai son
id).
J’ai essayé de “jouer” avec mes models, en vain.
J’essaye de créer une fonction dans Fiche.rb.
def scooters
if not self.id.nil?
return Scooter.find( :all, :include =>
[:categories], :conditions =>
{ :liaison_entre_fiches_categories_scooters => self.id})
end
end
Apparemment l’inclusion de la table categories dans ma requête ne se
fait pas, puis je ne sais comment spécifier une colonne de la table
inclus.
Comment puis je résoudre mon problème s’il vous plait ?
Je vous en remercie par avance.
pourrais-tu préciser le but de ta requête s’il te plaît?
Si je comprends bien tu souhaites, à partir d’une fiche, récupérer
l’ensemble des scooter qui appartiennent à une catégorie spécifique.
Plus clairement, je souhaiterai récupérer 4 scooters aléatoirement,
mais ces scooters doivent appartenir à une fiche (à un
concessionnaire) précise (exemple, une fiche avec pour id 1). La
catégorie n’a pas réellement d’importance dans ma requête. C’est juste
une table / modèle liant les fiches / concessionnaires aux scooters.
En SQL, ca donnerai une requête comme :
SELECT scooters.image
FROM fiches, categories, scooters
WHERE fiches.id = categories.fiche_id
AND categories.id = scooters.category_id
AND fiches.id = 1
ORDER BY RAND()
LIMIT 0, 4;
J’espère avoir été plus clair, si il faut je fournirai des parties de
codes et extraits de base de données.
Ok, tu peux le faire en mettant une association has_many :scooters,
:through
=> :fiches dans ton Concessionnaire, ensuite tu peux faire quelque chose
du
genre :
Merci beaucoup c’est exactement ce que je cherchais !
J’ai donc mis dans fiche.rb :
has_many :scooters, :through => :categories
Puis toujours dans fiche.rb, j’ai créé une méthode :
def scooters_random
result = Scooter.find( :all, :include =>
{:category, :fiche}, :conditions => [ “fiches.id = ? AND
scooters.url_photo != ‘’”, self.id], :order => ‘RAND()’, :limit => 4)
list = []
result.each do |scooter|
if not scooter.url_photo.nil?
list << scooter unless File.exists?( scooter.url_photo)
end
end
list
end
La méthode fait correctement son travail, mais elle vous semble ruby
way ?
Oui je m’en suis rendu compte, as tu quelque chose à me conseiller ?
Ca dépend de l’importe que tu attaches au fait d’avoir ou pas une
photo. Si tu veux absolument une photo, tu fais ton tirage au sort sur
les photos au lieu de les faires sur les scooter (et après à partir de
la photo tu peux avoir le scooter facilement)