Я работаю над приложением 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.