Прежде чем я отправлю это как ошибку команде направляющих, я хотел видеть, делаю ли я что-то не так, что может вызывать это поведение. А именно: свойство автосохранения has_many ассоциаций, кажется, не работает согласно документам.
Для ссылки вот актуальнейшая документация API: http://api.rubyonrails.org/classes/Acti … ation.html
Смотрите на раздел "One-many Example". Я копировал код там точно в тестовом приложении, и он не работает на меня. А именно, родительский объект обновляется, но дочерний объект не.
Моя схема следующие:
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
В консоли я выполняю следующие команды (сообщение, и объекты комментариев уже находятся в DB в этой точке):
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 мс) "сообщения" УСТАНОВИЛО "updated_at" = '18.01.2010 23:32:39', "заголовок" = 'На миграции уток' ГДЕ "идентификатор" = 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 мс) "комментирует" SET "updated_at" = '18.01.2010 23:44:43', "тело" = 'На самом деле, Ваша статья, нужно назвать по-другому. [ОБНОВЛЕННЫЙ]: Вы правы, спасибо'. ГДЕ "идентификатор" = 2
Таким образом, это действительно выглядит поврежденным мне. Я предполагаю, что это - проблема со способом, которым ссылки на объект обрабатываются, т.е. что, после того как объект является частью выделенного набора, который это сохраняет прекрасный, но не сохраняет, когда это вытягивают как отдельный объект от базы данных. Но прежде чем я отправляю это команде направляющих как ошибка, я хотел видеть, столкнулся ли кто-либо еще с этой проблемой, или если я просто делаю что-то абсолютно глупое, которое я не вижу, потому что я весь день тратил на это.