Comment lier les éléments d'une table entre eux

Re bonjour, et merci pour les réponses données à mes précedentes
questions.

Ma quesiton :

J’ai une table qui contient des artists et j’aimerais, pour un artist
donné, pouvoir lui associé plusieurs artists.

J’avais pensé créer une autre table:

lien_artist(artist1_id, artist2_id)

Ainsi pour mon artist, j’aurais à chercher tous les elements de cette
nouvelle table qui contiendrait l’id de mon artist dans le champ de
droite ou de gauche, et conserver les ids des artists présents dans
l’autre champ.

Et je me demandais si c’était la bonne méthode, et si, ainsi que comment
cela était intégré avec ActiveRecord.

Voili voilou, Merci d’avance !

Une autre petite question, si en plus d’avoir des artists, on a des
genres, des albums et des titres, que l’on veux faire des liaisons
has_and_belongs_to_many entre ces tables :

genres <=> artists
genres <=> albums
artists <=> albums

Et qu’en plus, on veuille lier les albums entre eux, ca ne risque pas
d’être long de récuperer les données ?

Salut !

J’ai une table qui contient des artists et j’aimerais, pour un artist
donné, pouvoir lui associé plusieurs artists.

Quand qqu’un pose une question, je déteste lui répondre à côté… mais
désolé,
je résiste pas.

En fait, le lien en question, doit correspondre à qqchose dans la vie
vraie ?
C’est qu’ils forment un groupe, un couple dans la vie, une bande de
copain ou je
sais quoi d’autre ?

Si c’est le cas, ça vaut souvent la peine de le formaliser, en faisant
par
exemple une entité groupe, et une relation has_and_belongs_to_many
artists. si
ça te sers pas à grand chose maintenant, ça risque de pas mal te sauver
plus
tard, le jour ou tu rajouteras des nouvelles infos à ce “groupe”.

gUI

En fait, le lien en question, doit correspondre à qqchose dans la vie
vraie ?
C’est qu’ils forment un groupe, un couple dans la vie, une bande de
copain ou je
sais quoi d’autre ?

Nan, nan, je parle plus d’une relation de similarité musicale.

Ainsi, si quelqu’un veux ajouter un artist qui n’est pas encore dans la
bdd (ou un groupe, distinction que je ne fais pas), il aura la
possibilité de le lier à d’autre artists pour dire au visiteur : “Si
vous voulez savoir un peu le genre de zik que produit cet artist,
écoutez donc ceux-ci, tel album, on y retrouve des similarités”

Moi aussi ça m’interesse, parceque je me casse aussi les dents sur les
relations réflexives en N-N
Apparemment il faut utiliser :through pour rester dans les conventions,
et
ce n’est pas simple.
…**

Le 02/03/07, Guillaume B.
[email protected]
a écrit :

Ainsi, si quelqu’un veux ajouter un artist qui n’est pas encore dans la
bdd (ou un groupe, distinction que je ne fais pas), il aura la
possibilité de le lier à d’autre artists pour dire au visiteur : “Si
vous voulez savoir un peu le genre de zik que produit cet artist,
écoutez donc ceux-ci, tel album, on y retrouve des similarités”

ok, je vois ce que tu veux dire.

je pense que tu peux dois pouvoir faire un truc style :

has_many :similarites, :class_name => Artist, :foreign_key => artist_id

l’idée est d’avoir accès à artist.similarites, mais evidemment de ne pas
créer
un modèle Similarite, mais de réutiliser Artist (vu que de toutes façons
il
s’agit d’un artist)

tu dis que tu distingue pas groupe d’artiste, si un jour tu veux créer
des
relations de groupe (Sting et Police), tu pourrais imaginer la meme
chose, en
faisant dans ton modèle Artist un :

has_many :membres, :class_name => Artist, :foreign_key => artist_id

ATTENTION : je suis pas sur de ce que je te dis, je l’ai juste fait avec
une
relation has_one, pas avec une relation has_many.

tiens-moi au jus, la réponse m’interresse (-:

gUI

Merci beaucoup je vais tester tout ça.

Oui, moi aussi !
Réponse + complément d’information, c’est gros merci :wink:

D’apres moi, la notion de “groupe”, “genre”, “similarité”…existe
réellement.
Donc il semble complètement cohérent de faire 2 tables, et ne pas se
prendre
la tete avec la réflexivité.

++

Le 05/03/07, Mun [email protected] a écrit :

J’ai trouvé ça aussi… Mais je pense que la solution de Jean-Francois
est celle qui me faut…

http://blog.hasmanythrough.com/2006/04/21/self-referential-through

Frédéric :

Moi aussi ça m’interesse, parceque je me casse aussi les dents
sur les relations réflexives en N-N
Apparemment il faut utiliser :through pour rester dans les
conventions, et ce n’est pas simple.

Ce n’est pas une question de conventions, tu as le choix
entre has_and_belongs_to_many (habtm) et has_many :through
(hmt), hmt s’avère plus puissant car tu manipules la jointure
comme un modèle Active Record, tu peux l’enrichir d’attributs AR…
Mais rien ne t’empêche d’utiliser habtm.

Pour en revenir à la question de Mun :

create_table :artists do |t|
t.column :name, :string
t.column :firstname, :string
end

create_table :similarities do |t|
t.column :artist_id, :integer, :null => false
t.column :similar_artist_id, :integer, :null => false
end

class Artist < ActiveRecord::Base
has_many :similarities
has_many :similar_artists, :through => :similarities
end

class Similarity < ActiveRecord::Base
belongs_to :artist
belongs_to :similar_artist,
:foreign_key => ‘similar_artist_id’,
:class_name => ‘Artist’
end

Pour pouvoir écrire ensuite des choses comme :

a, b = Artist.find [1, 2]
a.similar_artists << b

Il y a un patch : http://dev.rubyonrails.org/ticket/6466
qui semble marcher.

-- Jean-François.

Re bonjour, comment fait-on pour installer ces fixs ?

ma poire:

Pour pouvoir écrire ensuite des choses comme :

a, b = Artist.find [1, 2]
a.similar_artists << b

Il y a un patch : http://dev.rubyonrails.org/ticket/6466
qui semble marcher.

bitsweat vient d’appliquer le patch et l’a porté dans la
branche 1.2. Le fix sera dispo dans Rails 1.2.3.

http://dev.rubyonrails.org/changeset/6336

-- Jean-François.