: свойство автосохранения ассоциаций has_many, нарушенное в Rails 2.3.4? - PullRequest
7 голосов
/ 19 января 2010

Прежде чем опубликовать это как ошибку в команде rails, я хотел посмотреть, делаю ли я что-то не так, что может быть причиной такого поведения.В частности, свойство: autosave ассоциаций has_many, похоже, не работает в соответствии с документами.

Для справки приведем самую последнюю документацию по API: http://api.rubyonrails.org/classes/Acti… ation.html

Взгляните на раздел «Пример один ко многим».Я точно продублировал там код в тестовом приложении, и он не работает для меня.В частности, родительский объект обновляется, но дочерний объект не является.

Моя схема выглядит следующим образом:

create_table :posts do |t|
  t.string :title

  t.timestamps
end

create_table :comments do |t|
  t.text :body
  t.integer :post_id

  t.timestamps

Мои модели следующие:

  class Post < ActiveRecord::Base
    has_many :comments, :autosave => true
  end

  class Comment < ActiveRecord::Base
    belongs_to :post
  end

В консоли я запускаю следующие команды (объекты post и comments уже находятся в БД на данный момент):

  post = Post.find(1)
  post.title # => "The current global position of migrating ducks"
  post.comments.first.body # => "Wow, awesome info thanks!"
  post.comments.last.body # => "Actually, your article should be named differently."

  post.title = "On the migration of ducks"

  post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks."

  post.save
  post.reload

Но вот что я получаю для вывода:

  post.title # => "On the migration of ducks"
  post.comments.last.body # => "Actually, your article should be named differently."

Далее, просматривая журналы, это единственное обновление, которое я вижу:

Обновление сообщения (0,6 мс) ОБНОВЛЕНИЕ "posts" SET "updated_at" = '2010-01-18 23:32:39', "title" =' О миграции уток 'ГДЕ "id" = 1

Таким образом, похоже, что сохранение не касалось объекта комментариев, который мне кажется явно нарушенным.Я пробовал это на двух разных системах под управлением 2.3.4, и поведение повторяется.

Вот странная часть, хотя: если я сначала вызываю "post.comments", прежде чем я пытаюсь установить значение, это работаетотлично!Чтобы быть точным:

  post.title = "On the migration of ducks"

  post.comments #Note that this line was not called above
  post.comments.last.body = "Actually, your article should be named differently. [UPDATED]: You are right, thanks."

  post.save 
  post.reload

Теперь вывод дает мне правильные результаты:

  post.title # => "On the migration of ducks"
  post.comments.last.body # => "Actually, your article should be named differently. [UPDATED]: You are right, thanks."

И журналы содержат правильное обновление:

Обновление комментария (0,3 мс) UPDATE "comments" SET "updated_at" = '2010-01-18 23:44:43', "body" = 'На самом деле, ваша статья должна называться по-другому.[ОБНОВЛЕНО]: Вы правы, спасибо.ГДЕ "id" = 2

Так что это действительно выглядит для меня сломанным.Я предполагаю, что это проблема способа обработки ссылок на объекты, то есть, когда объект является частью выделенной коллекции, он хорошо сохраняет, но не сохраняет, когда он извлекается как отдельный объект из базы данных.Но прежде чем представить это команде Rails как ошибку, я хотел посмотреть, не сталкивался ли кто-нибудь еще с этой проблемой, или я просто делаю что-то совершенно бессмысленное, чего не вижу, потому что провел весь день на этом.

1 Ответ

0 голосов
/ 15 июня 2011

Это так часто, как и следовало ожидать, и обходной путь достаточно прост:

last_comment = post.comments.last
last_comment.body = "[totally awesome dream hands]"
last_comment.save

Не очень лаконично, но функционально:)

...