Rails:如何在更新其嵌套属性后运行模型回调?

时间:2017-02-20 18:34:04

标签: ruby-on-rails ruby

我在更新嵌套属性后尝试对模型进行回调。在回调期间,我无法访问新创建的嵌套属性id。下面是一些例子:

型号:

class OptionType < ActiveRecord::Base 

    has_many :option_values
    accepts_nested_attributes_for :option_values
    after_update :print_new_option_value

    def print_new_option_value

        @option_value = []

        option_values.each do |option_value|
            if option_value.new_record?
                @option_value << option_value
            end
        end

        @option_value.each do |ov|
            print "This is the new option_value name = #{ov.name}"
            print "This the new option_value id = #{ov.id}"
        end
    end
end

class OptionValue < ActiveRecord::Base
    belongs_to :option_type
end

在使用新选项值(名称:新选项值)更新选项类型后,将显示以下rails日志:

enter image description here

  1. 消息可以显示更新选项类型
  2. 后输入的嵌套属性名称
  3. 但嵌套属性ID为空
  4. 结果是嵌套属性在选项类型回调后更新。
  5. 我的问题,如何在调用选项类型回调之前更新嵌套属性(选项值)?原因是,我需要访问某些代码的嵌套属性id。

    非常感谢和赞赏。

1 个答案:

答案 0 :(得分:0)

您也可以从另一方面解决此问题 - 将after_create回调添加到OptionValue模型,该模型将通知OptionType

class OptionType < ActiveRecord::Base
    has_many :option_values
    accepts_nested_attributes_for :option_values

    def print_new_option_value(new_option)
       print "This is the new option_value name = #{ov.name}"
       print "This the new option_value id = #{ov.id}"
    end
end

class OptionValue < ActiveRecord::Base
    belongs_to :option_type
    after_create :notify_option_type

    def notify_option_type
      option_type.print_new_option_value(self)
    end
end