Vielleicht erinnert sich der eine oder andere aus der Schnittmenge der treuen Leser dieses Blogs und der regelmäßig bei unserer Diplomandenrunde in Dortmund Anwesenden noch daran, dass wir "damals" erwähnt hatten, dass es manchmal, aber nicht immer, in Rails zu einer Exception kommt, wenn man z.B. sowas hier probiert:
@client.user.system_groups.access_rights
obwohl alles ganz sicher korrekt mit has_many
usw. definiert wurde. Ich werde hier nichts breittreten, was mich grob geschätzt die letzten 4 Stunden und viel mehr Nerven als diese Stunden Sekunden haben, gekostet hat, sondern es in einem einfachen Satz zusammenfassen:
NIEMALS in Join-Tables einen Primärschlüssel namens 'id' verwenden!!
das Problem ist, dass bei einem Join wie diesem:
User.find(17).system_groups
dieses SQL generiert wird:
SELECT * FROM `system_groups`
INNER JOIN groups_users
ON system_groups.id = groups_users.group_id
WHERE (groups_users.user_id = 17 )
Na, wem fällt's auf? genau, da steht SELECT * FROM ...
, und nicht, wie es sich gehört, SELECT system_groups.* ...
. Damit tritt der Spaltenname id
nämlich zweimal im Resultat auf (einmal von der Gruppentabelle und einmal von der Join-Table), wobei letzten Endes die ID von der Join-Table von Rails verarbeitet wird und dann als FALSCHE system_group_id
eingesetzt wird.
Nach dem Entfernen der id
Spalte aus groups_users
lief alles wie erwartet.
Man mag mich bei Gelegenheit dafür steinigen, dass ich in Join-Tables eine künstliche ID-Spalte verwende, aber Rails' Verhalten bezeichne ich in diesem Fall als schlichtweg falsch. I hereby declare it a bug.
Comments (1)
Du könntest die ganzen Dinge doch mal ins RoR trac als Ticket eintragen?
Nur so ne Idee.
Posted by Philipp H. | January 28, 2008 5:07 PM
Posted on January 28, 2008 17:07