Rails: изменения в объекте не будут зависать - PullRequest
0 голосов
/ 08 июня 2010

У меня есть модель с именем voip_phone, у которой есть атрибут schedule, представляющий собой строку, которая отслеживает, в какое время люди используют телефон.Вот пример schedule:

"mon{}sun{}sat{}tue{13,08:45,15:15;}wed{13,09:00,17:30;}thu{}fri{}"

Вот код модели, который не будет работать:

def add_shift(days, person_id, time_from, time_to)  
    return false if shift_overlap?(days, time_from, time_to)  
    days.each do |d|  
        insert_point = self.schedule.index(d)+4  
        self.schedule.insert(  
            insert_point, [person_id.to_s, time_from, time_to].join(",") + ";")  
    end  
    save!  
end

Независимо от того, что я делаю,Я не могу заставить этот метод работать.Вот показания с консоли:

v = VoipPhone.find(5)  
=> blah, blah, blah  
v.add_shift(["thu", "fri"], 13, "08:45", "15:15")  
=> true  

Кажется, это работает, но изменения не сохраняются.Вызов v.schedule показывает новое расписание, но вызов VoipPhone.find(5).schedule по-прежнему показывает старое расписание.Вызов v.save вернет истину, но изменения все равно не сработают!

Любая помощь, которая может быть предложена душе без кармы, будет принята с благодарностью:)

1 Ответ

1 голос
/ 08 июня 2010

Вы столкнулись с оптимизацией "грязных атрибутов", которая была представлена ​​в Rails 2.3 AFAIR

См. эту статью

короче, звоните "self.schedule_will_change!" прежде чем фактически изменить его.

Если это не сработает, то вы можете обойти это с помощью «dup», например:

self.schedule = self.schedule.insert(....).dup
...