Tôi đã mô phỏng chính xác tình huống giống như của bạn và phát hiện ra:
Bất cứ khi nào một mô hình (Bài đăng) có has_many through
sau đó liên kết khi tạo một phiên bản của Mô hình đó, tức là Post
chuyển Hash
ví dụ:Post.new( JSON.parse(json) )
hoặc Post.new(id: 113)
Có vẻ như Rails xử lý chúng theo cách khác nhau mặc dù chúng đang trỏ đến cùng một bản ghi.
Tôi đã chạy các lệnh sau theo trình tự như dưới đây:
p = Post.last
p.tags
p.tags.count
json = p.to_json
p2 = Post.new( JSON.parse(json) )
p2.tags
p2.tags.count ## Gives incorrect count
p3 = Post.find(JSON.parse(json)["id"]) ### See notes below
p3.tags
p3.tags.count ## Gives the correct count
Thay vì tạo một bản sao mới của Post bằng cách sử dụng Hash trực tiếp, tôi đã tìm nạp bản ghi từ cơ sở dữ liệu bằng cách sử dụng id
thu được từ json deserializing. Trong trường hợp này, phiên bản p3
và phiên bản p2
tham chiếu đến cùng một Bài đăng nhưng Rails diễn giải chúng theo cách khác nhau.