You are not logged in.

  • Login

1

Wednesday, November 3rd 2010, 11:32am

Verbindungstabelle: undefined method `update_attributes'

Hallo ihr =)

Ich bastel hier aktuell mit RoR rum und fange an mich so langsam dran zu gewöhnen ;)
Dennoch habe ich gerade ein Problem welches ich mir nicht so recht erklären kann:

Also ich habe unter anderen drei Tabellen:

Bash

1
2
3
People{id, name, ...}
Themenblocks{id, bezeichnung, ... }
person_themen{id, person_id, themenblock_id}


Über die komische Namensgebung bitte nicht wundern.. Rails meinte irgendwie die Hälfte zu übersetzen und ins plural zu bringen >.< Muss ich nächstesmal aufpassen ;)

So dazu passend drei Models:

Person.rb

RubyOnRails Quellcode

1
2
3
4
class Person < ActiveRecord::Base
  has_many :person_themen;
  has_many :themenblock, :through => :person_themen;
end


Themenblock.rb

RubyOnRails Quellcode

1
2
3
4
class Themenblock < ActiveRecord::Base
  has_many :person_themen;
  has_many :person, :through => :person_themen;
end


person_themen.rb

RubyOnRails Quellcode

1
2
3
4
class PersonThemen < ActiveRecord::Base
  belongs_to :person, :class_name => 'person', :foreign_key => 'people_id';
  belongs_to :themenblock, :class_name => 'themenblock', :foreign_key => 'themenblock_id';
end



So. versuche ich in dem Personcontroller neue zuweisungen von Personen und Themen in der person_themen Tabelle abzulegen:

RubyOnRails Quellcode

1
2
3
4
5
def update
    @personThemen = PersonThemen.find(:all, :select => "people_id, themenblock_id", :conditions => "people_id = #{params[:id]}" )
    @personThemen.update_attributes(params[:themen])
    ...
  end


Und erhalte folgendes:

Bash

1
undefined method `update_attributes' for [#<PersonThemen people_id: 1, themenblock_id: 1>]:Array



Ich habe wirklich keine Ahnung warum... warum gibt es die Methode bei allen anderen (Person, Themenblock) aber bei der Zwischentabelle nicht??


Vielen Dank im Voraus!
Thimo

2

Wednesday, November 3rd 2010, 3:43pm

Wozu hast du hier has_many :person_themen definiert?


Person.rb

RubyOnRails Quellcode

1
2
3
4
class Person < ActiveRecord::Base
  has_many :person_themen;
  has_many :themenblock, :through => :person_themen;
end



Wenn ich das richtig sehe, willst du "nur" Personen (people) mit Themen verbinden? dann sollte das zweite has_many ausreichen, wenn mich nicht alles täuscht.
Ich teste alle Models in der Console (script/console). Da kannst du einfach Objekte anlegen und dir anschauen, welche Zuorndungen stimmen bzw. nicht stimmen.
Eigentlich solltest du dann über folgende Anweisungen zum Ziel kommen (evtl. fehlerhaft, da ich lange kein Ruby mehr gemacht hab):

RubyOnRails Quellcode

1
2
p = Person.find(1)
p.themenblock


Übrigens würde ich mich an deiner Stelle für eine Sprache bezüglich der Namensgebung entscheiden. Ich empfehle Englisch, da sich Helper usw. dann einfacher lesen lassen. Aus den Models leiten sich nämlich auch die Routen usw. ab, was ganz praktisch bei Formularen etc. nutzbar ist. In dem Beispiel hier würde ich die Models sogar neu und diesmal konsistent erzeugen.

Falls du noch immer Probleme hast, zeig doch mal ein wenig mehr deiner Models, dann probier ich das mal aus, wenn ich Zeit habe (heute am späten Abend).

Achja: Welche Rails-Version?

3

Wednesday, November 3rd 2010, 3:56pm

Das gleiche Problem hatte ich kürzlich auch. Es liegt an folgendem Query:

RubyOnRails Quellcode

1
@personThemen = PersonThemen.find(:all, :select => "people_id, themenblock_id", :conditions => "people_id = #{params[:id]}" )

Dort wirst du logischerweise immer nur ein Ergebnis erhalten, aber woher soll Rails das wissen. Rails rechnet durch :all, dass es mehrere Ergebnis erhalten könnte. Ersetze einfach :all durch :first und es sollte funktionieren.
Wenn ich mich recht erinnere, bekommst du sonst ein Array mit den Row-Objekten, in deinem Fall zwar nur mit einem Eintrag, aber eben ein Array und der hat keine Methode update_attributes().

Alternativ könntest du wahrscheinlich auch einfach auf das erste Element von @personThemen zugreifen und dort dann update_attributes() ausführen.


ch bastel hier aktuell mit RoR rum und fange an mich so langsam dran zu gewöhnen ;)

Rails macht Programmierer faul ;-).

4

Wednesday, November 3rd 2010, 4:50pm

Hallo ihr beiden,


erstmal vielen Dank für eure Hilfe.
Jau da sind einige Geschichten die ich etwas seltsam zusammengestrickt habe ;)
Beim nächsten Projekt schalte ich erstmal dieses "pluralisieren" von Datenbanktabellen aus... die spinnen doch :D

Zu dem doppel und dreifach "has_many": Das hatte ich aus einem Tutorial... fand ich damals schon seltsam aber naja bin in der RoR Welt ziemlich neu da glaubt man fast alles ;)

Falls jemand mal ein ähnliches Problem hat hier eine recht schicke Lösung die genau mein Vorhaben wiederspiegelt: http://www.justinball.com/2008/07/03/che…ls-using-habtm/


Viele Grüße und einen schönen Abend euch!
Thimo

PS: Jau RoR macht stellenweise Faul ;) Wenn ich das bisher richtig einschätze würde ich behaupten dass man nach 1-2 erfolgreichen Projekten mit RoR wirklich schnell was auf die Beine stellen kann.

Similar threads

Social bookmarks