Rails 3.2 — ActiveRecord::RecordNotFound — Не удается найти вновь созданный объект в БД

#ruby-on-rails #ruby #postgresql #activerecord

#ruby-on-rails #ruby #postgresql #активная запись

Вопрос:

Кто-нибудь сталкивался с этим странным поведением с ActiveRecord? Я работаю под Rails 3.2 с Ruby 1.9.3..

У меня есть следующий метод:

 def send_response (number, text, t_id=nil)
    begin
        sms_id = Sms.log(number, text, t_id)
        begin
            envy = Rails.env
            prop = @PROPS_ENV['environment']['notification.sms']
            if envy == 'production' || prop
                Sms.update_status(sms_id, Sms::PROCESSING)
                Integrator.send_sms(number, text)
                Sms.update_status(sms_id, Sms::SENT)
            else
                Sms.update_status(sms_id, Sms::PROCESSED)
            end
        rescue => er1
            Sms.update_status(sms_id, Sms::ERROR)
        end
    rescue => err
        puts "#{mm} ---> General ERROR!! => #{err.inspect}"
    end
end
 

Класс Sms определяется следующим образом:

 class Sms < ActiveRecord::Base
    attr_accessible :phone_number, :content, :status
    
    NEW        = "new"
    PROCESSING = "processing"
    SENT       = "sent"
    PROCESSED  = "processed"
    ERROR      = "error"
    SMS_STATUS = [NEW, ENQUEUED, SENT, ERROR, PROCESSING]

    validates :status, inclusion: { in: SMS_STATUS }

    def self.log(number, text, t_id, status=NEW)
        sms = Sms.new(phone_number: number, content: text, status: status)
        sms.t_id = t_id
        sms.save!
        return sms.id
    end
    
    def self.update_status(sms_id, status)
        sms = Sms.find(sms_id)
        sms.status = status
        sms.save!
    end
end
 

Проблема возникает в строке [ Sms.update_status(sms_id, Sms::PROCESSING) ], вызывая ошибку ActiveRecord::RecordNotFound: Не удалось найти с id=XX, где XX — идентификатор вновь созданного регистра в методе Sms.log . Если я ищу объект из консоли Rails, используя тот же идентификатор, я могу его найти.

Я пропустил фиксацию? Или, возможно, база данных PostgreSQL 11 еще не выполнила фиксацию, когда Rails выполняет метод Sms.update_status?

Такое поведение происходит не всегда, но случается несколько раз (~ 20% выполнений, но оно сильно варьируется).

Заранее спасибо за любую помощь..

Комментарии:

1. похоже, вы используете очень старый Ruby и Rails, а также очень новый PostgreSQL … есть ли какой-нибудь вариант взглянуть на обновление Rails и Ruby до чего-то более современного? если нет, есть ли вероятность, что у вас на столе включено автоматическое увеличение?

2. Итак, у вас есть только одна база данных или настройка лидера / последователя? Кстати, зачем вам повторно загружать запись при обновлении? Вместо того, чтобы возвращать идентификатор записи после создания, вы могли бы просто вернуть сам экземпляр. Преимущество которого в том, что он тоже будет быстрее.

3. спикерманн, ты понял.. Большое спасибо, это была проблема.. У нас сбалансированный уровень БД, поэтому проблема была решена путем возврата самого объекта, как вы указали.. Добавьте это в качестве ответа, пожалуйста..