Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails:ruby解释器在更新键值表时崩溃_Ruby On Rails_Ruby_Exception_Activerecord_Crash - Fatal编程技术网

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

Ruby on rails rails:ruby解释器在更新键值表时崩溃,ruby-on-rails,ruby,exception,activerecord,crash,Ruby On Rails,Ruby,Exception,Activerecord,Crash,我有一个2列的表,带有view\u id和count。 该表是使用:id=>false创建的 该表为每个视图(实际上是一个报告)保存其显示的次数 因为每个id只能有一个条目,所以我正在尝试插入,如果插入失败,我将进行更新 def self.inc_count(view_id) # try insert ViewDisplay.create(:view_id => view_id, :count => 1) rescue ViewDisplay.u

我有一个2列的表,带有view\u id和count。 该表是使用:id=>false创建的

该表为每个视图(实际上是一个报告)保存其显示的次数

因为每个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堆栈跟踪和转储(几百行)

第186行有这样一句话:stmt.reset

我实际上有两个问题:

  • 在前面的代码中,我遗漏了什么,我希望rescue能够捕捉到这个表达式

  • 更新表的最佳方式是什么。 我选择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
    

    表中是否存在特定的
    视图\u id
    (即是否成功创建记录,或者是否在第一次请求中尝试更新)?是的,它确实存在。我刚刚切换到AcriveRecord::Base.connection().execute(),它可以正常工作。在控制台中运行上述两个命令也可以正常工作。
    create_table :view_displays, :id => false do |t|
      t.integer :view_id
      t.integer :count
    end
    
    add_index :view_displays, :view_id, :unique => true