如何在其字段更改时使composition_of值对象更新或重新创建自身?

时间:2011-04-26 16:42:48

标签: ruby-on-rails activerecord

我正在开发一个rails-2.3应用程序,该应用程序正在使用composed_of创建一个Address类,该类知道如何对其自身进行地理编码等等。这一切都很好,但是给定一个带有地址的加载模型,当我更改模型上组成地址的字段时,地址实例既不会更改也不会自动重新创建,我怕我无法想出强制实现这一目标的最简洁方法。

模型代码很简单:

class Model < ActiveRecord::Base

  composed_of :address, :mapping => [%w(address1 address1), %w(address2 address2), %w(city city), %w(state state), %w(postal_code postal_code), %w(country_code country), %w(longitude lng), %w(latitude lat)]

end

有什么建议吗?

我随后回答了这个问题,但已经无法回答我自己的问题了,所以这里有:

事实证明,composed_of创建了一个具有(未记录的)force_reload参数的reader方法。我利用它并为每个组合字段创建访问器方法:

  composed_of :address, :mapping => ADDRESS_MAPPING                                                      
  ADDRESS_MAPPING.each do |field, composed_field|                                                        
    next if %w(latitude longitude).include?(field)                                                       
    define_method "#{field}=" do |value|                                                                 
      self[field] = value                                                                                
      if send("#{field}_changed?")                                                                       
        self[:longitude] = nil                                                                           
        self[:latitude] = nil                                                                            
        address(true)                                                                                    
      end                                                                                                
    end                                                                                                  
  end                                                                                                    

这有点儿,但它确实有效。

我可能会看到这个改变的因素?检查基于composition_of的阅读器方法。

2 个答案:

答案 0 :(得分:1)

您可以手动reload变量:

@my_variable.reload

或在after_save回调中发生(也在您的模型中)。

编辑:

您可以执行以下操作:

@my_variable.clear_aggregation_cache

(当然将其包装在回调中)

参见模块ActiveRecord::Aggregations

答案 1 :(得分:0)

您可以定义自定义转换器,然后直接将自定义数据分配给:address属性。