仅为视图更改rails模型中的属性

时间:2014-08-14 12:47:44

标签: ruby-on-rails ruby ruby-on-rails-4

我有点问题。我发现很难为此创建一个标题,我希望我能更好地解释它:

我们的一位客户要求在" 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

谢谢!

1 个答案:

答案 0 :(得分:3)

尝试使用read_attribute来避免递归:

class Product < ActiveRecord::Base
  ...
  def item_number
    read_attribute(:item_number).to_s.rjust(5, '0')
  end
  ...
end