2011-01-07 3 views
0

Ich habeRails - Erstellen oder Datensatz aktualisieren .... Wenn Aussage vs gefunden oder erstellt werden durch

@user = User.find(1) 
@event = Event.find(1) 
for interest in @event.interests 
    @user.choices.create(:interest => interest, :score => 1) 
end 

richtig funktioniert, aber es schafft Aufzeichnungen jedes Mal. Ich möchte überprüfen, ob ein Datensatz mit der entsprechenden Zins-ID aus der for-Schleife vorhanden ist, und wenn es tut, würde ich gerne aktualisieren, sonst ist die Erstellung in Ordnung.

Ich schaute mich um und fand die "find_or_create_by" -Methode, aber es funktioniert nicht wirklich für mich. Ich hatte =>

@user.choices.find_or_create_by_interest(:interest => interest.id, :score => 1) 

und bekomme den Fehler "undefined Methode` find_by_interest '".

Können Sie sehen, was ich falsch mache? Oder ist es besser, bei der if/else-Anweisung zu bleiben?

Ich war nicht sicher, ob die find_or_create_by-Methode die Update-Attribut-Fähigkeit in sich hatte.

Antwort

6

Wieder einmal sollten Sie find_or_create_by_interest_id_and_score

+0

ich den Fehler ... Unknown-Taste (s): Partitur, Interesse ??? Hast du das schon mal gesehen? – ChrisWesAllen

+0

find_or_create_by_interest_id_and_score (interest.id, 1). Aber Vorsicht! Wenn Sie jemals ein Objekt mit der guten ID, aber der falschen Punktzahl haben, wird es versuchen, es zu erstellen und wird fehlschlagen: Sie können nicht zwei Objekte mit der gleichen ID haben. – apneadiving

+0

ja ... das ist ein Weg, es zu tun, aber es nicht die Datensätze aktualisieren, die gefunden ... es nur hinzufügen, wenn es keinen Datensatz finden kann .... Ich fange an zu denken, dass eine if/else-Anweisung könnte die beste Option sein – ChrisWesAllen

2

tun, wenn ich nicht auf zu verkennen bin, was Sie versuchen, die Art und Weise zu erreichen, es zu tun ist:

find_or_create_by_interest_id(:interest => interest.id) { |u| u.score = 1 } 
Verwandte Themen