繁体   English   中英

在postgres /活动记录中保存字符串时,请保持前导零

[英]Keep leading zeros when saving a string in postgres/active record

我在Postgres DB中使用Rails 4,但遇到一个问题,其中前导零未保存在我的邮政编码列中。 该列的数据类型是字符串。 当我在Rails控制台中,并且将邮政编码从“ 7040”更新为“ 07040”且前导零时,会被告知已保存。 但是,当我查找对象时,邮政编码仍然是“ 7040”,而不是“ 07040”。

我在SO上看到了这个问题,但是答案建议重新启动服务器(我的行为没有任何变化),并提到问题出在该用户的情况下,列的数据类型曾经是整数。 我的数据类型一直是字符串。

在活动记录中保存字符串时保持前导零

您可以在下面的图像中看到我在rails控制台中进行此工作的快照。 我有一个帐户。 我用前导零保存邮政编码。 保存似乎起作用。 然后,我通过其ID查找该帐户,并查找邮政编码,结尾的“ 0”不保存:

我已经在这里保存了更新我的控制台映像!

保存的Rails控制台示例!

我在模型上也有这些验证:

验证:contact_name,:company_name,:organization_id,:billing_address,:city,:state,:zip,状态:true

验证:account_number,唯一性:{scope::organization_id}

为了更具体地解决这个问题,我在下面进行了两个测试。 非常奇怪的是,测试B通过时,测试A失败了。 所以这不是在前面保存0的问题-不知何故我在保存以'0'开头的字符串时遇到了问题。 为什么会这样呢? 我有很多要更新的zip,所以我不能像TEST B一样手动设置它们-我需要找到一种方法以TEST A的方式保存它们。

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

您可以掩盖客户端上的值,而不必担心数据库。

"%05d" % zip_code.to_i

因此,我认为您会被insertprepend两个都就地修改字符串的事实所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.zipnew_zip仍然是同一对象,并且如果rails在zip=方法内部对其进行比较,它们将看起来是相同的。 因此,Rails认为属性没有改变。 这就是为什么在控制台会话中说a.save! 没有发出UPDATE Rails没有意识到该属性是脏的。

您可以通过调用s.zip_will_change!解决此s.zip_will_change! 或对新字符串进行赋值,例如s.zip = "0#{s.zip}"

奇怪的是,我发现由于以下几行原因导致未保存压缩文件:

new_zip = @ a.zip.prepend(“ 0”)

@ a.zip = new_zip

@ a.save!

由于某些原因,上面带有“ prepend”的代码将无法保存,但是下面的代码可以工作。 所以我用这个更新了我的拉链,它正在工作。

@ a.zip =(“ 0” + @ a.zip)

@ a.save

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM