我有点问题。我发现很难为此创建一个标题,我希望我能更好地解释它:
我们的一位客户要求在" item_number"的每个实例中,当它来自产品型号时,应用必须以5个前导零显示它。
" item_number"该模型中的proprety实际上是数据库中的整数。
我们的第一种方法是在模型中更改值:
def item_number
item_number.to_s.rjust(5, '0')
end
当然我们得到了:
SystemStackError at /
stack level too deep
我非常确定在创建/更新记录时会出现问题,但这并不重要,反正它无法正常工作。
解决方案很简单,只需创建:
def item_number_with_leading_zeroes
item_number.to_s.rjust(5, '0')
end
并在我们的视图中将item_number替换为它。
但是,我们有超过5000次使用它,其中一些不是来自这个模型(我们只需要替换此模型上的item_number),其中一些是在我们编写的不使用父对象的迭代器内部名称(因此我可能不知道它是否来自此模型),其他名称来自自定义表单输入,我们不能只替换所有"。
我必须手动检查" item_number"的每一个实例。并查看是否需要将其更改为新方法。我仍然可以犯错并影响很多东西。
我只需要在视图上更改它,我想到了一种让它与助手一起工作的方法,但这仍然意味着我必须逐个改变它。
还有另一个选项来修复它,将数据库中的所有记录更新为使用零字符串并从现在开始生成before_save选项,但我们首先想要一个rails解决方案,然后再这样做(将数据库保留为原样)现在)。
我没有想法,我不知道是否有解决方案,我想在这里问首先希望有人可以分享一些想法。 有什么方法可以做到这一点,而无需手动检查整个应用程序吗?
Ruby 2,Rails 4.0
谢谢!
答案 0 :(得分:3)
尝试使用read_attribute
来避免递归:
class Product < ActiveRecord::Base
...
def item_number
read_attribute(:item_number).to_s.rjust(5, '0')
end
...
end