2014-01-11 3 views
1

У меня есть метод обновления, который не сохраняет записи базы данных, как ожидалось.Rails активная запись не сохраняется, как ожидалось

В основном то, что происходит, заключается в том, что device_id не сохраняет таблицу временного интервала, как я ожидал бы с помощью метода ниже.

Из вывода моей переменной после save! я бы подумал, что расположение_организации сохранится в таблице временного интервала.

Может ли кто-нибудь сказать мне, почему это не так, и что я здесь делаю неправильно?

# PUT /arrangements/1 
    def update 
    success = false 

    @arrangement = Arrangement.find(params[:id]) 

    # Remove arrangement id from old timeslot 
     old_timeslot = Timeslot.find(@arrangement.timeslot_id) 
     old_timeslot.arrangement_id = nil 

     # Save arrangement id to new timeslot 
     new_timeslot = Timeslot.find(@arrangement.timeslot_id) 
     new_timeslot.arrangement_id = @arrangement.id 

     p "old_timeslot = #{old_timeslot.inspect}" 
     p "new_timeslot = #{new_timeslot.inspect}" 

     old_timeslot.save! 
     new_timeslot.save! 

     p "after save old_timeslot = #{old_timeslot.inspect}" 
     p "after save new_timeslot = #{new_timeslot.inspect}" 

     @arrangement.update_attributes!(params[:arrangement]) 
     success = true 

    respond_to do |format| 
     if success 
     format.html { redirect_to @arrangement, notice: 'Arrangement was successfully updated.' } 
     else 
     format.html { render action: "edit" } 
     end 
    end 
    end 

Вот консольный вывод:

# These are before the old_timeslot and new_timeslot variables are saved 
"old_timeslot = #<Timeslot id: 17306, location_id: 3, arrangement_id: nil, timeslot: \"2014-01-10 17:00:00\", created_at: \"2013-05-20 04:03:30\", updated_at: \"2014-01-11 01:35:55\">" 
"new_timeslot = #<Timeslot id: 17306, location_id: 3, arrangement_id: 839, timeslot: \"2014-01-10 17:00:00\", created_at: \"2013-05-20 04:03:30\", updated_at: \"2014-01-11 01:35:55\">" 

# These are after the old_timeslot and new_timeslot variables are saved 
"after save old_timeslot = #<Timeslot id: 17306, location_id: 3, arrangement_id: nil, timeslot: \"2014-01-10 17:00:00\", created_at: \"2013-05-20 04:03:30\", updated_at: \"2014-01-11 01:37:09\">" 
"after save new_timeslot = #<Timeslot id: 17306, location_id: 3, arrangement_id: 839, timeslot: \"2014-01-10 17:00:00\", created_at: \"2013-05-20 04:03:30\", updated_at: \"2014-01-11 01:35:55\">" 


Started PUT "/arrangements/839" for 127.0.0.1 at 2014-01-10 19:37:09 -0600 
Processing by ArrangementsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"REBgw/kRwlclqS670aIcIZ1Ug6kgxr/itEevwMQO2w8=", "arrangement"=>{"family_name"=>"smith", "location_id"=>"3", "date"=>"01/10/2014", "timeslot_id"=>"17306", "need"=>"myNeed", "notes"=>"mynotes", "user_id"=>"66"}, "button"=>"", "id"=>"839"} 
    User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1 
    Setting Load (0.4ms) SELECT `settings`.* FROM `settings` 
    Arrangement Load (0.4ms) SELECT `arrangements`.* FROM `arrangements` WHERE `arrangements`.`id` = 839 LIMIT 1 
    Timeslot Load (0.2ms) SELECT `timeslots`.* FROM `timeslots` WHERE `timeslots`.`id` = 17306 LIMIT 1 
    CACHE (0.0ms) SELECT `timeslots`.* FROM `timeslots` WHERE `timeslots`.`id` = 17306 LIMIT 1 
    (0.1ms) BEGIN 
    (0.3ms) UPDATE `timeslots` SET `arrangement_id` = NULL, `updated_at` = '2014-01-11 01:37:09' WHERE `timeslots`.`id` = 17306 
    (53.5ms) COMMIT 
    (0.1ms) BEGIN 
    (0.2ms) COMMIT 
Redirected to http://localhost:3000/arrangements/839 
Completed 302 Found in 168ms (ActiveRecord: 55.5ms) 

ответ

1

Прежде всего, это странно, что вы пытаетесь сделать два сохраняет в той же записи подряд. Пока идентификатор этих записей совпадает, второй второй должен просто перезаписать первый.

С другой стороны, поскольку Rails 2.0 или около того Rails имеет понятие «грязных» объектов и атрибутов. Так что вполне может быть, что назначение

new_timeslot.arrangement_id = @arrangement.id 

не меняет ничего, если атрибут arrangement_id уже имел значение @arrangement.id. Поэтому объект new_timeslot не будет отмечен как «грязный», а рельсы могут пропустить save! в качестве меры оптимизации. Несмотря на то, что вы предварительно обновили одну и ту же запись в БД, new_timeslot все еще не получает помечен как «грязный», потому что вы сделали это в другом экземпляре.

Так что вы хотите сохранить две разные записи, тогда вы должны поменять идентификатор хотя бы одного на nil (или создать новую запись и инициализировать ее теми же атрибутами), или вы хотите только обновить запись с помощью new_timeslot, тогда нет причин звонить save! на old_timeslot.

+0

Ahhh Я не знал об этом «грязном» объекте, о котором вы говорите. Это действительно отразило лампочку в моей голове, потому что я получаю ошибку при обновлении записи о расположении и НЕ меняю временной интервал. Теперь это имеет смысл. Кроме того, в моем коде old_timeslot и new_timeslot на самом деле получают разные записи, но в моем вопросе похоже, что они получают тот же b/c, что я что-то пытался. Спасибо за это. – Catfish

Смежные вопросы