У меня есть 2 модели с отношением «многие ко многим», реализованные has_many / own_to, следующим образом:
class Author < ApplicationRecord
has_many :author_books
has_many :books, :through => :author_books, :validate => false
end
class Book < ApplicationRecord
has_many :author_books
has_many :authors, :through => :author_books, :validate => false
end
class AuthorBook < ApplicationRecord
belongs_to :author
belongs_to :book
end
Таблицы были созданы в следующей миграции:
create_table :books do |t|
t.string :name
t.integer :price
end
create_table :authors do |t|
t.string :name
end
create_table :author_books do |t|
t.integer :book_id
t.integer :author_id
t.integer :percent
end
Когда я выполняю следующий тестовый код:
Book.delete_all
Author.delete_all
AuthorBook.delete_all
author1 = Author.create name: 'a1'
author2 = Author.create name: 'a2'
book = Book.new name: 'b', price: 40
book.authors = Author.where("id = #{author1.id} or id = #{author2.id}")
ret = book.save
AuthorBook.all.each do |ab|
puts "Author id #{ab.id} author #{ab.author_id} book #{ab.book_id}"
end
Я получаю следующий хороший вывод:
Author id 1 author 980190963 book 980190963
Author id 2 author 980190964 book 980190963
Но когда я добавляю следующее after_save
в AuthorBook:
after_save :f
def f
self.book.author_books.each do |ab|
# nothing
end
end
Я получаю следующий хороший вывод:
Author id 1 author 980190963 book 980190963
Author id 2 author 980190964 book
И действительно, когда я проверяю базу данных, я вижу, что запись AuthorBook содержит ноль в поле book_id. Есть идеи, почему это происходит?