Я сталкиваюсь с некоторыми Rails 2.3.5 Поведение ActiveRecord я не понимаю. Похоже, что у объекта могут быть обновлены идентификаторы ассоциации непоследовательным образом.
Это лучше всего объяснить на примере:
Создайте модель Post
со строковым атрибутом 'title'
и модель Comment
со строковым атрибутом 'content'
.
Вот ассоциации:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
Сценарий # 1: В следующем коде я создаю один Post
со связанным Comment
, создаю второй Post
, find
, используя первый, добавляя второй Comment
к первому Post
и обнаружить, что второй Post
имеет второй Comment
, связанный с ним без явного присвоения.
post1 = Post.new
post1 = Post.new(:title => 'Post 1')
comment1 = Comment.new(:content => 'content 1')
post1.comments << comment1
post1.save
# Create a second Post object by find'ing the first
post2 = Post.find_by_title('Post 1')
# Add a new Comment to the first Post object
comment2 = Comment.new(:content => 'content 2')
post1.comments << comment2
# Note that both Comments are associated with both Post objects even
# though I never explicitly associated it with post2.
post1.comment_ids # => [12, 13]
post2.comment_ids # => [12, 13]
Сценарий # 2: Запустите вышеупомянутые команды снова, но на этот раз вставьте одну дополнительную команду, которая, на первый взгляд, не должна влиять на результаты. Дополнительная команда - post2.comments
, которая выполняется после создания comment2
и до добавления comment2
к post1
.
post1 = Post.new
post1 = Post.new(:title => 'Post 1A')
comment1 = Comment.new(:content => 'content 1A')
post1.comments << comment1
post1.save
# Create a second Post object by find'ing the first
post2 = Post.find_by_title('Post 1A')
# Add a new Comment to the first Post object
comment2 = Comment.new(:content => 'content 2A')
post2.comments # !! THIS IS THE EXTRA COMMAND !!
post1.comments << comment2
# Note that both Comments are associated with both Post objects even
# though I never explicitly associated it with post2.
post1.comment_ids # => [14, 15]
post2.comment_ids # => [14]
Обратите внимание, что в этом сценарии есть только один комментарий, связанный с post2
, тогда как в сценарии 1 их было два.
Большой вопрос: почему запуск post2.comments
перед добавлением нового Comment
в post1
будет иметь какое-либо значение для комментариев, связанных с post2
?