Прежде чем опубликовать это как ошибку в команде 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 как ошибку, я хотел посмотреть, не сталкивался ли кто-нибудь еще с этой проблемой, или я просто делаю что-то совершенно бессмысленное, чего не вижу, потому что провел весь день на этом.