Verbindungstabelle: undefined method `update_attributes'

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

    1. People{id, name, ...}
    2. Themenblocks{id, bezeichnung, ... }
    3. 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 X( Muss ich nächstesmal aufpassen ;)

    So dazu passend drei Models:

    Person.rb

    Quellcode

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


    Themenblock.rb

    Quellcode

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


    person_themen.rb

    Quellcode

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



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

    Quellcode

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


    Und erhalte folgendes:

    Quellcode

    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
  • Wozu hast du hier has_many :person_themen definiert?

    F0kus schrieb:


    Person.rb

    Quellcode

    1. class Person < ActiveRecord::Base
    2. has_many :person_themen;
    3. has_many :themenblock, :through => :person_themen;
    4. 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):

    Quellcode

    1. p = Person.find(1)
    2. 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?
  • Das gleiche Problem hatte ich kürzlich auch. Es liegt an folgendem Query:

    F0kus schrieb:

    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.


    F0kus schrieb:

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

    Rails macht Programmierer faul ;-).
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • 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: justinball.com/2008/07/03/chec…uby-on-rails-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.