Как заставить составной объект значения обновлять или заново создавать себя при изменении его полей? - PullRequest
0 голосов
/ 26 апреля 2011

Я работаю над приложением rails-2.3, которое использует Comm_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

Есть предложения?

Впоследствии я ответил на это, но уже не могу ответить на свой вопрос, так что вот так:

Оказывается, что selected_of создает метод reader, имеющий (недокументированный) параметр force_reload. Я использую это и создаю методы доступа для каждого из составных полей:

  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                                                                                                    

Это немного странно, но работает.

Я мог бы увидеть, что факторинг изменился? Проверьте в методе based_of reader.

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Вы можете либо reload свою переменную вручную:

@my_variable.reload

, либо сделать это в обратном вызове after_save (также и в вашей модели).

РЕДАКТИРОВАТЬ:

Вы можете сделать следующее:

@my_variable.clear_aggregation_cache

(конечно, оберните его в обратный вызов)

См. Модуль ActiveRecord::Aggregations

0 голосов
/ 26 июля 2011

Вы можете определить пользовательский конвертер, а затем назначить пользовательские данные непосредственно атрибуту: address.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...