rails:更新键值表时ruby解释器崩溃

时间:2011-11-29 08:36:58

标签: ruby-on-rails ruby exception activerecord crash

我有一个带有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!

我实际上有两个问题:

    在前面的代码中
  1. ,我错过了什么,我原本预计救援会抓住那个表达

  2. 更新表格的最佳方法是什么。 我选择insert + update,因为这不需要事务,并行访问也是安全的。

  3. 感谢。

    随访:

    此处用于创建表的迁移。 这是一个“改变”功能:

    create_table :view_displays, :id => false do |t|
      t.integer :view_id
      t.integer :count
    end
    
    add_index :view_displays, :view_id, :unique => true
    

0 个答案:

没有答案