teddio
December 8, 2006, 3:50pm
1
Salut tout le monde,
Dans mon appli, j’ai des Galleries qui comprennent des Medias de
différents Types (image ou vidéo) qui peuvent eux-mêmes avoir plusieurs
Thumbnails. Donc, voici mes modèles:
class Gallery < ActiveRecord::Base
has_many :medias
end
class Media < ActiveRecord::Base
belongs_to :gallery
has_many :thumbnails
end
class Thumbnail < ActiveRecord::Base
belongs_to :media
end
class Type < ActiveRecord::Base
# rien (pour le moment)
end
Quand j’affiche une galerie, je sélectionne tout ce qu’il me faut:
@gallery = Gallery.find(params[:id], :include => { :medias =>
:thumbnails })
Mes médias ont un champ “type_id”.
J’aimerais donc pouvoir sélectionner d’un côté les images (type_id == 1)
et de l’autre les vidéos (type_id == 2), toujours avec Gallery.find qui
m’est bien utile pour les traitements à l’affichage. J’aimerais alors
avoir accès à des tableaux de cette façon:
@gallery.pictures # tableau des images de la galerie
@gallery.movies # tableau des vidéos de la galerie
Ca me permettrait de n’avoir qu’une seule requête SQL. Alors j’ai essayé
un peu dans tous les sens, en trifouillant dans le Gallery.find, mais je
n’arrive à rien. Pensez-vous que c’est possible?
Bonne fin de semaine et bon week-end à tous,
Michael
teddio
December 8, 2006, 5:11pm
2
Salut,
has_many :thumbnails
end
Tu pourrais envisager le STI (Single Table Inheritance)
En ajoutant un champ :type, : string, :limit=>20 dans Media
et en laissant Active Record gérer deux sous-classes.
class Image < Media
pas besoin de table dans la DB!!
end
class Video < Media
Itou, hérite des propriétés de Media
end
Video.create ( :title => “DHH Hotesse de l’Air”)
Va insèrer un enregistrement dans Media avec “Video” dans type…
Magie!!
teddio
December 8, 2006, 7:59pm
3
Salut Michael,
Evite la classe Type (surtout que c’est un terme très générique).
Préfère les STI.
Tu aurais pu faire ça mais tu ne veux pas :
class Gallery < AR::B
has_many :videos, :class_name => “Media”, :foreign_key =>
‘gallery_id’, :conditions => ‘type_id == 1’
end
Tu pourrais aussi faire :
class Gallery < AR::B
def pictures
medias.find :all, :conditions => ‘type_id == 1’
end
....
end
Mais bon, les STI c’est plus classe… alors…
à+np_______________________________________________
Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance
teddio
December 11, 2006, 12:37pm
4
belongs_to :gallery
pas besoin de table dans la DB!!
Magie!!
Merci pour l’info, j’ai donc découvert les STI dans RoR. C’est
effectivement beaucoup plus propre que ma table “types”.
J’ai mis ça en place et voici une nouvelle question. J’essaie de faire
ceci:
@gallery_pictures = Source.find(:first, :include => { :pictures =>
:thumbnails }, :conditions => ['sources.id = ?', params[:id]])
Mais j’obtiens cette erreur:
Association named 'pictures' was not found; perhaps you misspelled
it?
Est-il dès lors possible de créer cette association, pour que le find
ci-dessus chope la Gallery et ses Pictures?
Bonne semaine à tout le monde!
Michael