rails: сбой интерпретатора ruby ​​при обновлении таблицы ключ-значение - PullRequest
0 голосов
/ 29 ноября 2011

у меня есть таблица из 2 столбцов с view_id и count. Таблица была создана с помощью: id => false.

Таблица содержит количество отображений для каждого представления (фактически отчета).

Поскольку для каждого идентификатора должна быть только одна запись, я пытаюсь вставить, если это не удается, я обновляю.

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 (длиной в несколько сотен строк).

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!

На самом деле у меня есть 2 вопроса:

  1. в предыдущем коде, что я пропустил, я бы ожидал, что спасение ловит это выражение

  2. что было бы лучшим способом обновить таблицу. Я выбираю 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
...