我有一个带有view_id和count的2列表。 该表创建时使用:id =>假的。
该表适用于每个视图(实际上是一个报告)显示的次数。
由于每个id只有一个条目,我正在尝试插入,如果失败我正在更新。
def self.inc_count(view_id)
# try insert
ViewDisplay.create(:view_id => view_id, :count => 1)
rescue
ViewDisplay.update_all("count = count + 1", ["view_id = ?", view_id])
end
在调用此函数的页面的第一个请求中,我得到异常
column view_id is not unique
在第二次调用时,解释的ruby会崩溃,并显示以下消息,然后是C堆栈跟踪和转储(多个hunderds行长)。
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.9ms)
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.7ms)
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (7.6ms)
/usr/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/connection_adapters/sqlite_adapter.rb:186: [BUG] Segmentation fault
ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux]
第186行有这样的陈述:stmt.reset!
我实际上有两个问题:
,我错过了什么,我原本预计救援会抓住那个表达
更新表格的最佳方法是什么。 我选择insert + update,因为这不需要事务,并行访问也是安全的。
感谢。
随访:
此处用于创建表的迁移。 这是一个“改变”功能:
create_table :view_displays, :id => false do |t|
t.integer :view_id
t.integer :count
end
add_index :view_displays, :view_id, :unique => true