Я пытаюсь использовать ActiveRecord find_or_create_by_*column*
, но я получаю ошибки от Postgres, которые сообщают мне, что иногда не удается найти модель, и в любом случае пытается вставить ее. Очень важно, чтобы я сохранял эту таблицу уникальной, поэтому я добавил атрибут :unique => true
к ее миграции, чтобы Postgres знал, что я серьезно к этому отношусь.
И, сбой:
ActiveRecord::StatementInvalid: PGError: ERROR: duplicate key value violates unique constraint "index_marketo_leads_on_person_id" DETAIL: Key (person_id)=(9968932) already exists. : INSERT INTO "marketo_leads" ("mkt_person_id", "synced_at", "person_updated_at", "person_id") VALUES(NULL, NULL, '2011-05-06 12:57:02.447018', 9968932) RETURNING "id"
У меня есть такие модели:
class User < AR::Base
has_one :marketo_lead
before_save :update_marketo_lead
def update_marketo_lead
if marketo_lead
if (User.marketo_columns & self.changes.keys).any?
marketo_lead.touch(:person_updated_at)
end
elsif self.id
marketo_lead = MarketoLead.find_or_create_by_person_id(:person_updated_at => Time.now, :person_id => self.id)
end
end
end
class MarketoLead
belongs_to :user, :foreign_key => 'person_id'
end
Вторая модель используется для привязки учетных записей наших пользователей к серверу электронной почты Marketo и ведения учета последнего изменения определенных полей пользователя, чтобы мы могли отправлять измененные записи в пакетных фоновых задачах.
Я не могу думать ни о какой причине для этого обратного вызова, update_marketo_lead
, чтобы потерпеть неудачу, кроме какого-то состояния гонки, которое я не могу себе вообразить.
(пожалуйста, не обращайте внимания на чудовищность «пользователя», разделяющего первичный ключ с «человеком»)
(с использованием Rails 2.3.11, Postgres 9.0.3)