2016-07-01 5 views
2

Als Teil eines Projekts habe ich ein Session Modell erstellt, um die Daten zu speichern, wenn es zuerst erstellt und aktualisiert wurde (mit dem timestamps Plugin von Sequel zur Verfügung gestellt). Dies erleichtert die serverseitige Behandlung von Sitzungstimeouts. Die Spalte updated_at kann mit Sequels touch-Plugin aktualisiert werden, das eine äquivalente Methode bereitstellt.NoExistingObject Ausnahme bei Verwendung Sequel :: Model.plugin Zeitstempel und berühren

jedoch bei dem Versuch, es zu benutzen, ich die folgenden Fehlermeldung

Sequel :: NoExistingObject: Versuch Objekt zu aktualisieren nicht in einer einzigen Zeile Änderung ergeben hat (SQL: UPDATE sessions SET updated_at = ‚2016 -07-01 12: 17: 06.373469 'WHERE (id = 14))
von/Benutzer/[GEFILTERTER NUTZERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ edelsteine ​​/ 2.3.0/edelsteine ​​/ fortsetzung -4.35.0/lib/sequel/model/base.rb: 2018: in _update'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/model/base.rb:2011:in
_update_columns '
von/Benutzer/[GEFILTERTER BENUTZERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ gems/2.3.0 /gems/sequel-4.35.0/lib/sequel/ model/base.rb: 1965: in block (2 levels) in _save'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/model/base.rb:1146:in
around_update '
von/Benutzer/[GEFILTERTER BENUTZERNAME] /. rbenv/versions/2.3.1/lib/ruby ​​/ edelsteine ​​/ 2.3.0/edelsteine ​​/ fortsetzung-4.35.0/lib/sequel/model/base.rb: 1949: in block in _save'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/model/base.rb:1146:in
around_save '
aus/Benutzer/[GEFILTERTER BENUTZERNAME] /. rbenv/versions/2.3.1/lib/ruby ​​/ edelsteine ​​/ 2.3.0/edelsteine ​​/ sequel- 4.35.0/lib/sequel/model/base.rb: 1935: in _save'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/model/base.rb:1587:in
block (2 levels) in save '
von/Benutzer/[GEFILTERTER BENUTZERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ Edelsteine ​​/ 2.3.0/Edelsteine ​​/ Fortsetzung/4.35.0/lib/Folge/Modell/base.rb: 2089: in block in checked_transaction'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/database/transactions.rb:163:in
_transaction '
von/Benutzer/[GEFILTERTER BENUTZERNAME] /. rbenv/versions/2.3.1/lib/ruby ​​/ Edelsteine ​​/ 2.3.0/Edelsteine ​​/ Folge-4.35.0/lib/Folge/Datenbank/Transaktionen.rb: 138: in block in transaction'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/database/connecting.rb:251:in
block in '
von/Users/[GEFILTERTER USERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ edelsteine ​​/ 2.3.0/edelsteine ​​/ 4.35.0/lib/sequel/connection_pool/threaded .rb: 105: in hold'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/database/connecting.rb:251:in
synchronisieren '
von/Benutzer/[GEFILTERTER BENUTZERNAME] /. rbenv/versions/2.3.1/lib/ruby ​​/ gems/2.3.0/gems/sequel-4.35.0/lib/Fortsetzung /database/transactions.rb:104:in transaction'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/model/base.rb:2089:in
checked_transaction '
... 7 Stufen ...
von/Benutzer/[GEFILTERTER BENUTZERNAME] /. rbenv/versions/2.3.1/lib/ruby ​​/ gems/2.3 .0/gems/railties-4.2.6/lib/rails/commands/console.rb: 9: in start'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:68:in
Konsole ' von/Benutzer/[GEFILTERTER BENUTZERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ Edelsteine ​​/ 2.3.0/Edelsteine ​​/ Eisenbahnen-4.2.6/lib/Schienen/Befehle/Befehle_Tasks.RB: 39: in run_command!' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-4.2.6/lib/rails/commands.rb:17:in ' von/Benutzer/[GEFILTERTER BENUTZERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ edelsteine ​​/ 2.3.0/edelsteine ​​/ ativesupport-4.2.6/lib/active_support/dependencies.rb: 274: in require' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in block in require ' von/Benutzer/[GEFILTERTER BENUTZERNAME] /. Rbenv/versions/2.3.1/lib/ruby ​​/ edelsteine ​​/ 2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb: 240: in load_dependency' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in require ' von/Benutzer/[GEFILTERTER BENUTZERNAME]/Sync/RubymineProjects/[GEFILTERTER PROJEKTNAME]/bin/rails: 9: in lade' von/Users/[FILTERED USERNAME] /. Rbenv/versions /2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in block in load' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in load_dependency ' von/Benutzer/[GEFILTERTER BENUTZERNAME] /. Rbenv/Versionen/2.3.1/lib/Ruby/Edelsteine ​​/ 2.3.0/Edelsteine ​​/ Activesupport-4.2.6/lib/active_support/Abhängigkeiten.r b: 268: in load' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in requires ' von/Benutzer/[GEFILTERTER BENUTZERNAME] /. rbenv/versions/2.3.1/lib/ruby ​​/ site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb: 55: in require' from -e:1:in '

Ich habe bereits versucht, unter Verwendung der Sequel::Model.update und Sequel::Model.update_all Methoden, jedoch ohne Erfolg (der gleiche Fehler empfangen).

Interessant ist, dass ich in der Lage bin, die SQL-Abfrage, die oben produziert wurde, über die Befehlszeile sowohl mit SQLite als auch mit MySQL auszuführen.

==== app/models/session.rb ====

class Session < Sequel::Model 
    plugin :validation_helpers 
    plugin :timestamps 
    plugin :touch 

    def before_update 
    self.touch 
    end 

    def before_save 
    Session.where(user_id: self.user_id).delete 
    end 

    def self.sweep(time = 2.hours) 
    time = time.split.inject { |count, unit| count.to_i.send(unit) } if time.is_a?(String) 
    Session.where("updated_at < '#{time.ago.to_s(:db)}' OR created_at < '#{1.day.ago.to_s(:db)}'").delete 
    end 

    def validates 
    validates_presence [:user_id] 
    end 
end 

Dank Voraus für jede Hilfe zur Verfügung gestellt.

Antwort

0
def before_save 
    Session.where(user_id: self.user_id).delete 
end 

Das wird alle Zeilen in der Session Tabelle mit dem gleichen User_id löschen, bevor die Sitzung, einschließlich der aktuelle Zeile (wenn die Aktualisierung und nicht zu schaffen) zu speichern. Wenn Sie nur eine einzelne Sitzung zulassen möchten, sollten Sie wahrscheinlich zur Verwendung von before_create wechseln. Vergessen Sie auch nicht, super in Ihren Hooks zu rufen.

Verwandte Themen