2016-02-09 2 views
1

Я использую Rails 4 с DB Postgres и имею проблему, когда ведущие нули не сохраняются в моем столбце почтового индекса. Тип данных для этого столбца - строка. Когда я нахожусь в консоли rails, и я обновляю и почтовый индекс учетной записи от «7040» до «07040» с начальным нулем, мне говорят, что он сохраняется. Однако, когда я просматриваю объект, почтовый индекс по-прежнему «7040», а не «07040».Сохранять ведущие нули при сохранении строки в postgres/active record

Я видел этот вопрос на SO, но ответ предполагает перезапустить сервер (что я сделал без изменений в поведении) и упоминает, что проблема была в том случае, когда тип данных столбца использовался как целое. Мой тип данных всегда был строкой.

keep leading zeros when saving string in active record

Вы можете увидеть на изображении ниже снимок мне делать эту работу в рельсах консоли. Я получаю аккаунт. Я сохраняю zip с начальным нулем. Сохранение будет работать. Затем я просматриваю счет по его идентификатору и ищут zip, а конечный «0» не сохраняет:

Я обновил изображение консоли здесь с сохранением!

rails console example with save!

Также у меня есть эти валидации на модели:

проверяет: CONTACT_NAME,: company_name,: organization_id,: billing_address,: город,: состояние,: застежка-молния, присутствие: истинные

validates: account_number, уникальность: {scope:: organization_id}

Также, чтобы уточнить проблему, у меня есть два теста ниже. Очень странно TEST A терпит неудачу, пока проходит TEST B. Таким образом, это не вопрос сохранения 0 на фронте - так или иначе у меня возникла проблема с сохранением строки, которая была добавлена ​​с «0». Почему это так? У меня есть много молний для обновления, так что я не могу вручную установить их все как TEST B - мне нужно найти способ, чтобы сохранить их в виде теста А.

it 'TEST A' do 
    @a= create(:account, zip: '299') 
    new_zip = @a.zip.prepend("0") 
    @a.zip = new_zip 
    @a.save! 
    @a.reload 
    @z = Account.find @a.id 
    expect(@z.zip).to eq('0299') 
end 

it 'TEST B' do 
    @a= create(:account, zip: '299') 
    @a.zip = "0299" 
    @a.save! 
    @a.reload 
    @z = Account.find @a.id 
    expect(@z.zip).to eq('0299') 
end 
+0

сообщение кода, где вы читаете значение. –

+1

Консоль не отображает 'SQL UPDATE', вызываемую' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Попробуйте «save!», Чтобы увидеть, какие ошибки он вызывает. –

+0

@WandMaker - спасибо за комментарий. Я только что обновил мое изображение консоли rails с призывом сохранить! Я вижу, что он говорит «Учетная запись существует» и нет обновления sql. Наверное, я в замешательстве - я не знаю, какая проверка ломается. Существует только одна учетная запись с этим номером учетной записи и организацией, чтобы она не нарушала мою проверку подлинности. Также я думал, что вызов .save вернет false, если проверка не прошла. –

ответ

0

Так что я думаю, что вы укусов тот факт, что insert и prepend как изменить строку на месте:

1.9.3-p194 :001 > s = "a" 
=> "a" 
1.9.3-p194 :002 > s.prepend "b" 
=> "ba" 
1.9.3-p194 :003 > s 
=> "ba" 
1.9.3-p194 :004 > s.insert 0, "c" 
=> "cba" 
1.9.3-p194 :005 > s 
=> "cba" 

Когда вы сделаете это, Rails не знает, что вы имеете изменил содержимое строки. Даже присваивание @a.zip = new_zip не помогает, потому что @a.zip и new_zip - все тот же объект, и если рельсы сравнивают их внутри метода zip=, они будут казаться идентичными. Таким образом, Rails считает, что атрибут не изменился. Вот почему в вашем консольном сеансе, когда вы говорите a.save!, выдается UPDATE. Rails не понимает, что атрибут грязный.

Вы можете обойти это, позвонив по телефону s.zip_will_change!. Или назначьте новую строку, например s.zip = "0#{s.zip}".

+0

Спасибо за объяснение! Я понял, что предварительная версия была проблемой, прежде чем вы разместили ее и изменили то, что я сделал (см. Мой ответ выше). Но это объясняет то, что я очень смутил. –

0

Вы можете маскировать значение на клиент и не беспокоиться о базе данных.

"%05d" % zip_code.to_i 
+0

Спасибо @AntarrByrd, но некоторые zips нужны для начала нуля, а некоторые нет, поэтому я не хочу добавлять 0, когда мне не нужно это, и я не хочу писать для определенных конкретных почтовых индексов определенный помощник. Мне бы хотелось разобраться в этом. –

0

Как ни странно, что я узнал, было то, что застежка-молния не спасал из-за этих линий:

new_zip = @ a.zip.перед именем ("0")

@ a.zip = new_zip

@ a.save!

По какой-то причине приведенный выше код с префиксом не сохранит, но код ниже работает. Поэтому я обновил свои молнии этим, и он работает.

@ a.zip = ("0" + @ a.zip)

@ a.save

Смежные вопросы