[Rails] Koppeltabellen

Pagina: 1
Acties:
  • 121 views sinds 30-01-2008
  • Reageer

  • Bigs
  • Registratie: Mei 2000
  • Niet online
LET OP: Het gaat hier om Ruby on Rails. Als je daar niet mee bekend bent hoef je niet te reageren, SQL advies heb ik namelijk niet zo veel aan ;) tnx

Voor de situatie van mijn probleem moet je even denken aan een Cu2/Sugababes-achtige site.

Ik heb een lijst met mensen en ik wil ze de mogelijkheid geven om vriendjes aan hun profiel te hangen (een n-op-n relatie, of de ander ook vrienden zijn met hun is hier niet belangrijk).

Op database-niveau doe ik dat normaal gewoon met een koppeltabel met daarin een gebruiker_id en vriendje_id of iets dergelijks (waarbij ik dus een lijst van vriendjes van gebruiker_id x uit kan halen en dan kan joinen met mijn gebruikerstabel).

Ik snap alleen niet hoe ik dit in Rails nu moet laten werken. Ik vermoed dat er in ActiveRecord wel iets ingebouwd zit hiervoor, maar ik kan het niet vinden :( Heb 'Agile web development with Rails' ook doorgezocht, maar daar lijkt het niet in te staan.

Iemand enig idee?

PS. Ik ben nog een redelijke n00b in Rails ;)

[ Voor 14% gewijzigd door Bigs op 21-02-2006 16:55 . Reden: alinea's ]


  • Exterazzo
  • Registratie: Mei 2000
  • Laatst online: 10-04 15:04

Exterazzo

Qeasy

Een 1-op-n relatie is toch zonder koppeltabel, dat kan je gewoon met een foreignkey doen afaik. Voor een n-op-n relatie heb je een koppeltabel nodig.

edit:
je bedoelt waarschijnlijk ook een n-op-n relatie, een persoon kan van meerdere mensen een vriendje zijn, en een persoon kan meerdere vriendjes hebben.

[ Voor 36% gewijzigd door Exterazzo op 21-02-2006 16:48 ]

Audentia


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Exterazzo schreef op dinsdag 21 februari 2006 @ 16:47:
Een 1-op-n relatie is toch zonder koppeltabel, dat kan je gewoon met een foreignkey doen afaik. Voor een n-op-n relatie heb je een koppeltabel nodig.

edit:
je bedoelt waarschijnlijk ook een n-op-n relatie, een persoon kan van meerdere mensen een vriendje zijn, en een persoon kan meerdere vriendjes hebben.
n-op-m ;)
Helaas ken ik te weinig van Ruby on Rails om verder iets zinnigs erover te zeggen, maar koppeltabel en n-op-m zijn wel de trefwoorden lijkt me.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Bigs
  • Registratie: Mei 2000
  • Niet online
Exterazzo schreef op dinsdag 21 februari 2006 @ 16:47:
Een 1-op-n relatie is toch zonder koppeltabel, dat kan je gewoon met een foreignkey doen afaik. Voor een n-op-n relatie heb je een koppeltabel nodig.

edit:
je bedoelt waarschijnlijk ook een n-op-n relatie, een persoon kan van meerdere mensen een vriendje zijn, en een persoon kan meerdere vriendjes hebben.
Je hebt gelijk.. het is ook een n-op-n relatie X) Ik moet ook geen termen willen gebruiken waar ik nooit mee werk

  • Bigs
  • Registratie: Mei 2000
  • Niet online
RobIII schreef op dinsdag 21 februari 2006 @ 16:49:
[...]

n-op-m ;)
Helaas ken ik te weinig van Ruby on Rails om verder iets zinnigs erover te zeggen, maar koppeltabel en n-op-m zijn wel de trefwoorden lijkt me.
Als ik de engelse term voor koppeltabel zou weten zou dat ook wel helpen.. enig idee toevallig?

  • Bigs
  • Registratie: Mei 2000
  • Niet online
Overigens heeft Rails zelf wel support voor koppeltabellen. Als je een tabel orders en products hebt kun je gewoon een orderitems tabel maken met daarin een order_id en product_id, dat pikt ie dat zelf op (mits je het goed in je model aangeeft).

Het probleem is dat ik niet weet hoe dat moet als beide kanten van de relatie in dezelfde tabel staan, dan zou je namelijk 2x een person_id kolom moeten hebben, ik moet dus in mijn model naar de andere veldnaam verwijzen (friend_id).

[ Voor 15% gewijzigd door Bigs op 21-02-2006 16:57 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
http://www.google.com/search?hl=en&q=sql+many+to+many ;)

Junction table...

[ Voor 26% gewijzigd door RobIII op 21-02-2006 16:56 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 05-01 14:41
Zoek even op rails en HABTM (Has And Belongs To Many) :)

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

http://api.rubyonrails.com/ -> http://api.rubyonrails.co...ClassMethods.html#M000474 :) .

Oftewel
Ruby:
1
2
3
class User < ActiveRecord::Base
    has_and_belongs_to_many :users
end
Niet getest of dit ook zo gaat werken, maar met een users_users koppeltabel zou het best wel eens kunnen.

[ Voor 46% gewijzigd door JHS op 21-02-2006 16:58 ]

DM!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Na wat googlen kwam ik hier: http://wiki.rubyonrails.com/rails/pages/Associations

Helaas had ik toen de post van bartvb nog niet gezien :X

[ Voor 47% gewijzigd door RobIII op 21-02-2006 17:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Bigs
  • Registratie: Mei 2000
  • Niet online
JHS schreef op dinsdag 21 februari 2006 @ 16:57:
http://api.rubyonrails.com/ -> http://api.rubyonrails.co...ClassMethods.html#M000474 :) .

Oftewel
Ruby:
1
2
3
class User < ActiveRecord::Base
    has_and_belongs_to_many :users
end
Niet getest of dit ook zo gaat werken, maar met een users_users koppeltabel zou het best wel eens kunnen.
Has_and_belongs_to_many zou inderdaad goed zijn als het om 2 verschillende tabellen ging. Ik zal zo eens wat proberen met die :association_key en :association_foreign_key.. volgens mij moet het daar toch wel mee lukken. Verder vind ik hier nog wel een hack, maar ik wil eigenlijk een nette oplossing.

[edit]
http://wrath.rubyonrails....2005-February/002646.html

Volgens mij is die className parameter wat ik nodig heb, als ik daar 'friend' op geef dan bedenkt Rails als het goed is zelf dat de kolom 'friend_id' in mijn tabel naar het record van de vriend wijst.

[ Voor 19% gewijzigd door Bigs op 21-02-2006 17:21 ]


  • Bigs
  • Registratie: Mei 2000
  • Niet online
Inmiddels heb ik de oplossing nu hier gevonden:

http://www.sitepoint.com/forums/showthread.php?t=309718

M'n model is nu als volgt:
code:
1
2
3
class Person < ActiveRecord::Base
        has_and_belongs_to_many :friends, :join_table => 'people_people', :foreign_key => 'person_id', :association_foreign_key => 'friend_id', :class_name => 'Person'
end


Waardoor ik in m'n viewer nu precies kan doen wat ik wilde:
code:
1
2
3
4
Vrienden van <%= @person.nickname %>:<br />
<% for friend in @person.friends %>
<%= link_to friend.nickname, {:action => 'show', :id => friend}  %><br />
<% end %>


Toch een mooi framework, Rails :)

[ Voor 16% gewijzigd door Bigs op 21-02-2006 18:13 ]

Pagina: 1