作为项目的一部分,我创建了一个 Session
模型来存储首次创建和更新的日期(使用 Sequel 提供的 timestamps
插件)。这是为了促进服务器端处理 session 超时。可以使用 Sequel 的 touch
更新 updated_at 列插件,它提供了一个等效的方法。
但是,当我尝试使用它时,我收到以下错误
Sequel::NoExistingObject: Attempt to update object did not result in a single row modification (SQL: UPDATE
sessions
SETupdated_at
= '2016-07-01 12:17:06.373469' WHERE (id
= 14))
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:2018:in_update'<br/> 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'
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:1965:inblock (2 levels) in _save'<br/> 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'
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:1949:inblock in _save'<br/> 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'
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:1935:in_save'<br/> 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'
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:inblock in checked_transaction'<br/> 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'
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:138:inblock in transaction'<br/> 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 synchronize'
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/sequel-4.35.0/lib/sequel/connection_pool/threaded.rb:105:inhold'<br/> 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
synchronize'
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:104:intransaction'<br/> 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 levels...
from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-4.2.6/lib/rails/commands/console.rb:9:instart'<br/> 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
console' 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:39:inrun_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
' 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:inrequire' 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' 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:inload_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' from /Users/[FILTERED USERNAME]/Sync/RubymineProjects/[FILTERED PROJECT NAME]/bin/rails:9:in<top (required)>' 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:268: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:268:inblock 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' 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:268:inload' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in
require' from /Users/[FILTERED USERNAME]/.rbenv/versions/2.3.1/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:inrequire' from -e:1:in
'
我已经尝试使用 Sequel::Model.update
和 Sequel::Model.update_all
方法,但无济于事(收到相同的错误)。
有趣的是,我能够使用 SQLite 和 MySQL 通过命令行运行上面生成的 SQL 查询。
==== 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
提前感谢您提供的任何帮助。
最佳答案
def before_save
Session.where(user_id: self.user_id).delete
end
这将在保存 session 之前删除 session 表中具有相同 user_id 的所有行,包括当前行(如果更新而不是创建)。如果你只想允许一个 session ,你应该切换到使用 before_create。另外,不要忘记在钩子(Hook)中调用 super
。
关于ruby-on-rails - 使用 Sequel::Model.plugin 时间戳和触摸时出现 NoExistingObject 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38141893/