Я сталкиваюсь с некоторым поведением ActiveRecord Rails 2.3.5, которое я не понимаю. Похоже, что идентификаторы ассоциации объекта могут обновляться непоследовательно.
Лучше всего это пояснить на примере:
Создайте модель 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
?