Frage So ermitteln Sie, ob ein Datensatz in after_save gerade erstellt oder aktualisiert wird


Der #new_record? Funktion bestimmt, ob ein Datensatz gespeichert wurde. Aber es ist immer falsch in der after_save Haken. Gibt es eine Möglichkeit zu bestimmen, ob der Datensatz ein neu erstellter Datensatz oder ein alter Datensatz aus dem Update ist?

Ich hoffe nicht, einen anderen Rückruf wie z before_create um eine Markierung im Modell zu setzen oder eine andere Abfrage in die db zu verlangen.

Jeder Rat wird geschätzt.

Edit: Muss es in bestimmen after_save Haken, und für meinen speziellen Anwendungsfall gibt es keine updated_at oder updated_on Zeitstempel


75
2018-02-11 23:30


Ursprung


Antworten:


Ich wollte das für eine verwenden after_save Rückrufen.

Eine einfachere Lösung ist zu verwenden id_changed? (Da es sich nicht ändern wird update) oder auch created_at_changed? wenn Timestamp-Spalten vorhanden sind.

Update: Wie @mitsy darauf hinweist, wenn diese Prüfung außerhalb von Rückrufen benötigt wird, dann benutze id_previously_changed?. Sehen Dokumente.


139
2017-08-25 00:41



Keine Schienen Magie hier, die ich kenne, du musst es selbst tun. Sie könnten dies mit einem virtuellen Attribut aufräumen ...

In deiner Modellklasse:

def before_save
  @was_a_new_record = new_record?
  return true
end

def after_save
  if @was_a_new_record
    ...
  end
end

28
2018-02-12 00:58



Noch eine andere Option für diejenigen, die machen einen haben updated_at Zeitstempel:

if created_at == updated_at
  # it's a newly created record
end

21
2018-02-05 00:28



Da ist ein after_create Callback, das nur aufgerufen wird, wenn der Datensatz ein neuer Datensatz ist, nachdem es gespeichert wurde. Es gibt auch ein after_update Callback zur Verwendung, wenn dies ein bestehender Datensatz war, der geändert und gespeichert wurde. Das after_save Callback wird in beiden Fällen nach beiden aufgerufen after_create oder after_update wird genannt.

Benutzen after_create wenn Sie nach dem Speichern eines neuen Datensatzes einmal etwas benötigen.

Mehr Infos hier: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html


19
2017-11-28 21:25



Da das Objekt bereits gespeichert wurde, müssen Sie sich die vorherigen Änderungen ansehen. Die ID sollte sich nur nach einem Erstellen ändern.

# true if this is a new record
@object.previous_changes[:id].any?

Es gibt auch eine Instanzvariable @new_record_before_save. Sie können darauf zugreifen, indem Sie Folgendes tun:

# true if this is a new record
@object.instance_variable_get(:@new_record_before_save)

Beide sind ziemlich hässlich, aber sie würden Ihnen erlauben zu wissen, ob das Objekt neu erstellt wurde. Ich hoffe, das hilft!


12
2017-09-15 17:36