#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. спикерманн, ты понял.. Большое спасибо, это была проблема.. У нас сбалансированный уровень БД, поэтому проблема была решена путем возврата самого объекта, как вы указали.. Добавьте это в качестве ответа, пожалуйста..