Rails ActiveRecord: помечает ли acceptpts_nested_attributes_for родительскую запись как грязную, даже если родительские атрибуты не изменены? - PullRequest
4 голосов
/ 30 мая 2011

Я синхронизирую данные с приложением для iPhone, поэтому важно знать, какие записи были «фактически» обновлены, а какие - нет.У меня есть модель событий с ассоциацией RelatedLink:

In event.rb:

has_many :related_links
accepts_nested_attributes_for :related_links, :reject_if => lambda { |a| a[:url].blank? && a[:id].blank? }, :allow_destroy => true

В моей форме событий, когда я ничего не меняю, включая поле RelatedLink, яхорошо ... на моей модели Event ничего не обновляется.Но если я введу URL в поле RelatedLink, «updated_at» в моем объекте Event будет обновлен.

UPDATE "events" SET "updated_at" = '2011-05-30 15:27:03.228435' WHERE "events"."id" = 1791

Должно ли это работать так?Могу ли я остановить его от пометки грязной и обновления?

1 Ответ

3 голосов
/ 13 июня 2012

Если атрибуты родительской модели не изменяются, то запись НЕ считается грязной, и updated_at не должно изменяться.Возьмем для примера (Rails 3.2.3)

Пост-модель

class Post < ActiveRecord::Base
  attr_accessible :title, :body, :comments_attributes

  has_many :comments
  accepts_nested_attributes_for :comments
end

Комментарий модели

class Comment < ActiveRecord::Base
  attr_accessible :body, :author
  belongs_to :post
end

Тест консоли Rails (я сохранил соответствующий вывод только после вставкиэто в)

1.9.3p194 :001 > p = Post.create :title => "Nested attributes", :body => "Nested attributes are awesome", :comments_attributes => [{ :body => "I agree", :author => "Bart" }]
=> #<Post id: 1, title: "Nested attributes", body: "Nested attributes are awesome", created_at: "2012-06-13 01:49:34", updated_at: "2012-06-13 01:49:34"> 

1.9.3p194 :002 > last_post = Post.last
=> #<Post id: 1, title: "Nested attributes", body: "Nested attributes are awesome", created_at: "2012-06-13 01:49:34", updated_at: "2012-06-13 01:49:34"> 

1.9.3p194 :003 > last_post.comments_attributes = [{:id => 1, :author => "Bort"}]
=> [{:id=>1, :author=>"Bort"}] 

1.9.3p194 :004 > last_post.changed?
=> false 

1.9.3p194 :005 > last_post.save
(0.1ms)  begin transaction
(0.7ms)  UPDATE "comments" SET "author" = 'Bort', "updated_at" = '2012-06-13 01:51:05.032862' WHERE "comments"."id" = 1
(250.1ms)  commit transaction
=> true 

1.9.3p194 :006 > last_post.updated_at
=> Wed, 13 Jun 2012 01:49:34 UTC +00:00 

Так что в вашем случае должно быть что-то еще, что вызывает обновление на Event.Проверьте, есть ли какие-либо обратные вызовы , которые могут это делать, а также проверьте, не определен ли ваш метод belongs_to с параметром :touch.Например

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