Активная запись продолжает «сохранить», если новый атрибут идентичен существующему? - PullRequest
2 голосов
/ 13 октября 2011

Я написал задачу, которая будет периодически запускаться для пересчета и обновления информации в определенном столбце модели Active Record. Часто новый вычисляемый объект (это хэш, закодированный в json, если это имеет значение) будет таким же, как существующие объекты. В таких случаях я подозреваю, что может быть более эффективно проверить эту идентификацию и прервать сохранение, а не сохранение. Таким образом, я рассматриваю использование self.save! if changed?, а не просто self.save!. Мои вопросы:

  1. Active Record делает это автоматически, так что эти две команды фактически эквивалентны?
  2. Если, как я подозреваю, это не так, могу ли я сэкономить процессорное время, добавив условие if changed??

1 Ответ

6 голосов
/ 13 октября 2011

Нет запросов к базе данных, вот простой пример использования Rails 3.1.1 в консоли:

> s = Shop.first   
 => #<Shop id: 1, name: "Ben", address: "paris", latitude:
> 48.856614, longitude: 2.3522219, gmaps: true, created_at: "2011-10-13 13:17:24", updated_at: "2011-10-13 13:17:24">  ruby-1.9.2-p290 :003 >

> s.name = "Ben"  => "Ben"  
> s.save  
=> true 
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00  

> s.update_attribute(:name, "Ben")
=> true 
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00 

> s.update_attributes({:name => "Ben"})
=> true 
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00 

> s.name = "Ben"  
=> "Ben"
> s.save!
> s.updated_at
=> Thu, 13 Oct 2011 13:17:24 UTC +00:00

Edit:

rails profiler 's = Shop.first; s.name = "Ben"; s.save;' 's = Shop.first; s.name =     
Loaded suite script/rails
Started
ProfilerTest#test_s_shop_first_s_name_ben_s_save (78 ms warmup)
    process_time: 5 ms
ProfilerTest#test_s_shop_first_s_name_ben_s_save_if_s_changed (1 ms warmup)
    process_time: 2 ms
Finished in 2.597531 seconds.

Так что быстрее с if changed?.

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