у меня есть таблица из 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 вопроса:
в предыдущем коде, что я пропустил, я бы ожидал, что спасение ловит это выражение
что было бы лучшим способом обновить таблицу.
Я выбираю 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