Find avec inclusions et conditions sur les inclusions... pos

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

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!!

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

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