0

Ich versuche zu überprüfen, ob das Kontrollkästchen ausgewählt wurde, und wenn ja, dann alle Datensätze zu aktualisieren, in denen eine bestimmte Spalte (- ein boolescher Wert in meiner Tabelle) wahr ist.Datensatz aktualisieren, wenn das Kontrollkästchen aktiviert ist

Das Hauptziel ist, dass nur ein Datensatz in der Spalte jemals "wahr" sein kann, und wenn ein neuer Datensatz erstellt/bearbeitet und das Kontrollkästchen aktiviert wird, wird dieser Datensatz wahr und der andere auf false.

Unter models/article.rb:

class Article < ActiveRecord::Base 
    if :update_checkbox == '1' 
    #find records where update_checkbox is true & update to false 
    Article.where(:update_checkbox => true).update_all(:update_checkbox => false) 
    end 
end 

ich meine Aufzeichnungen fein aktualisieren kann, aber es ist das ‚wenn Checkbox aktiviert ist‘ Teil ich Probleme mit, die ich - zur Zeit, als ich erstellen einen neuen Datensatz mit update_checkbox überprüft, dass die Zeile mit diesem Flag, das auf "True" gesetzt ist, nicht auf "False" gesetzt ist. Jede Hilfe wird geschätzt!

Antwort

1

können Sie, dass after_save Rückruf von Active erreichen nach erstellen/aktualisieren und setzen Sie Ihr update_checkbox Feld auf false

after_save :reset_update_checkbox 

def reset_update_checkbox 
    Article.where(:update_checkbox => true).update_all(:update_checkbox => false) 
end 

after_save Rückruf ausgeführt wird.

UPDATE

Bitte diese Lösung in Betracht ziehen. Basierend auf @ Index's asnwer

after_create :reset_and_update 
after_update :reset_and_update if update_checkbox_checked? 

def reset_and_update 
    Article.where("id = ? and update_checkbox = ?", self.id, true).update_all(update_checkbox: false) 
end 

def update_checkbox_checked? 
    self.update_checkbox 
end 

Ich bin mir ziemlich sicher, dass es den Trick tun wird.

+0

Vielen Dank für Ihre Hilfe! Das funktioniert ... meistens :) aber ich möchte den aktuellen Datensatz als wahr beibehalten und alle anderen als falsch definieren. Auch dies prüft nicht, ob das Kontrollkästchen "true/checked" ist, also werden alle Datensätze auf "false" (oder nicht nach dem was ich suche) auf den neuesten Stand gebracht. – LKB

+0

Ich habe 'after_save' in' before_save' geändert, was das erste Problem löst. Suchen Sie immer noch nach einer Möglichkeit zu überprüfen, ob das Kontrollkästchen aktiviert ist. – LKB

+0

@LKB hat nicht verstanden, dass Sie bestehenden Datensatz mit 'true' behalten müssen. In diesem Fall sehen Sie sich bitte die Antwort von @ index an. Es wird bestehenden Datensatz beibehalten mit 'update_checkbox = true' – retgoat

1

könnten Sie einen Rückruf verwenden und etwas tun, wie folgt aus:

after_save :reset_and_update if update_checkbox_checked? 

def reset_and_update 
    Article.where.not(id: self.id).update_all(update_checkbox: false) 
end 

def update_checkbox_checked? 
    self.update_checkbox 
end 

after_create nur alle anderen Datensätze false aktualisieren würde. Während after_update zuerst prüfen würde, ob update_checkbox wahr ist und alles außer Self auf false aktualisieren.

Testen Sie die diese unter Verwendung von Daten:

def update_checkbox_checked? 
    puts "this checkbox value is #{self.update_checkbox}" 
    puts self 
    self.update_checkbox 
end 
+0

Danke für Ihre Antwort! Ich habe es versucht, und es ersetzt die vorherigen 'update_checkbox' Werte auf false, aber es macht es, wenn das Kontrollkästchen des neuen Datensatzes wahr * und * falsch ist. – LKB

+0

Es scheint, dass die Checkbox-Prüfung vollständig ignoriert wird. Irgendeine Idee? – LKB

+0

Erstellen Sie den Datensatz mit 'update_checkbox' standardmäßig als' true'? – index

Verwandte Themen