2016-05-17 6 views
0

Ich möchte vorhandene Datensätze in der Rails-Konsole aktualisieren.Rails-Konsole: Attribute aktualisieren und in DB speichern

Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift end 

Funktioniert, aber das Ergebnis wird nicht in der DB gespeichert.

Beide

Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift self.update_columns(team: tname.team) end 

Oder

Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift self.update_attributes(team: tname.team) end 

funktionieren nicht. (NoMethodError: undefinierte Methode `update_attributes 'für main: Object)

Irgendwelche Ideen? Vielen Dank im Voraus!

Edit (Schema):

create_table "users", force: :cascade do |t| 
t.text  "team" 
end 

create_table "orders", force: :cascade do |t| 
t.integer "user_id" 
t.string "team" 
end 
+0

Welche db verwenden Sie? @Harakiri –

+0

Ich benutze Postgres – CottonEyeJoe

+0

anstelle von 'self.update_attributes (team: tname.team)' verwenden Sie einfach 'tname.save'. versuche so @Harakiri –

Antwort

0

Seltsam fix:

Durch sie in 2 Schritten eingeben, die funktioniert:

1) Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift

2) tname.save end

Statt

Order.all.each do |tname| tname.team = User.where(:id => tname.user_id).pluck(:team).shift tname.save end.

Absolut keine Ahnung warum ..

1

Was Sie tun, ist sehr ineffizient:

Order.all.each do |tname| 
    tname.team = User.where(:id => tname.user_id).pluck(:team).shift 
end 

Sie schlagen die Datenbank mit jeder Bestellung, in viele Anfragen zur Folge hat. Auch die Auswahl der Mannschaft via Zupfen ist ... seltsam. Wenn Sie eine User erhalten möchten und Zugriff auf sein Team Nutzung:

User.find_by(id: tname.user_id).team 

Aber Sie sollten diese ohnehin in einer Abfrage tun. Wenn Sie die Beziehungen richtig eingerichtet ist, sollte dies die Arbeit machen:

Order.joins(:user).update_all('team = users.team') 
+0

was soll 'tname.team' dann tun, wenn du diese spalte nicht hast? Fügen Sie bitte Ihr Schema hinzu –

+0

Ich habe vor kurzem 'team' zu Orders hinzugefügt. Jeder neue Datensatz wird korrekt ausgefüllt, aber ich möchte, dass die früheren Bestellungen auch mit dem jeweiligen Teamnamen des Benutzers ausgefüllt werden. – CottonEyeJoe

+0

Ich habe das Schema hinzugefügt. @TheChamp – CottonEyeJoe

Verwandte Themen