我有个小问题。我发现为此创建标题真的很难,我希望我能更好地解释它:
我们的一位客户要求,在“item_number”的每个实例中,当它来自 Product 模型时,应用程序必须显示它有 5 个前导零。
该模型中的“item_number”属性实际上是数据库中的一个整数。
我们的第一种方法只是更改模型中的值:
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
并在我们的 View 中用它替换 item_number。
但是,我们有超过 5000 次使用它,其中一些不是来自这个模型(我们只需要替换这个模型上的 item_number),还有一些在我们编码的迭代器中没有使用父对象名称(所以我可能不知道它是否来自这个模型),其他来自自定义表单输入,我们不能只是“全部替换”。
我将不得不手动检查“item_number”的每个实例,看看是否需要将其更改为新方法。而且我仍然会犯错误并影响很多东西。
我只需要在 View 上更改它,我想过一种让它与助手一起工作的方法,但这仍然意味着我必须逐个更改它。
还有另一种方法可以修复它,将数据库中的所有记录更新为带零的字符串,并从现在开始创建一个 before_save 选项,但在采用这种方法之前,我们首先想要一个 Rails 解决方案(保留数据库原样)现在)。
我没有想法,我不知道是否有解决方案,我想先在这里问一下,希望有人能分享一些想法。 有什么方法可以做到这一点而无需手动检查整个应用程序?
Ruby 2、Rails 4.0
谢谢!
最佳答案
尝试使用 read_attribute
来避免递归:
class Product < ActiveRecord::Base
...
def item_number
read_attribute(:item_number).to_s.rjust(5, '0')
end
...
end
关于ruby-on-rails - 仅为 View 更改 Rails 模型中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308434/