【问题标题】:How to get current value of attribute before saving new one in AR?在 AR 中保存新属性之前如何获取属性的当前值?
【发布时间】:2023-03-05 09:43:02
【问题描述】:

我有一个具有这些属性的模型:

  1. some_number
  2. some_string

我想根据some_number 的当前值和some_number 的新值在更新时为some_string 设置一些值。

例子:

当前some_number 4

some_number 的新(更新)值为 5

我想在some_number 被覆盖之前将4+5 字符串放入some_string

我怎样才能让它发挥作用?

【问题讨论】:

  • 覆盖 some_number= 设置器 -- cf stackoverflow.com/questions/10464793/…
  • 您能否更清楚地解释一下如何通过覆盖 setter 来解决我的问题?如何在该 setter 中获取当前值和新值?

标签: activerecord ruby-on-rails-4


【解决方案1】:

如果我需要根据更新事件上的其他属性值修改某些属性,我会这样做:

class Thing < ActiveRecord::Base
    before_update :modify_some_string
    protected
    def modify_some_string
            # some actions with self.some_string and self.some_number
            # and self.some_string_was and self.some_number_was
    end
end

【讨论】:

    【解决方案2】:

    很难从您的问题中看出,但假设您希望some_number 的当前值位于some_string 的末尾...

    class Thing < ActiveRecord::Base
      def initiaize
        @numbers = []
        super
      end
    
      def some_number=(value)
        @numbers << value
        write_attribute :some_string, @numbers.join('+')
        super
      end
    end
    

    【讨论】:

    • 请注意,此解决方案适用于对 some_number 的每次更改,与数据库中的模型是否为 saved 无关。
    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多