Методы связывания Rails has_many и own_to с неожиданным поведением - PullRequest
0 голосов
/ 06 июня 2018

Недавно я наткнулся на странное поведение с некоторыми из методов, добавленных belongs_to и has_many.

Рассмотрим следующий сценарий, представленный Руководством Rail Active Association по ассоциации записей .

class Author < ApplicationRecord
  has_many :books, inverse_of: :author
end

class Book < ApplicationRecord
  belongs_to :author, inverse_of: :books
end

Если я использую belongs_to * association=(associate) метод , я теряю ссылку на книгу автора:

book = Book.new
author = Author.new
book.author = author
author.books.include?(book) # false, expected true
author.books.empty? # true, expected to contain book

Но если я сделаюассоциация с has_many collection<<(object) метод , ссылка сохраняется, как и ожидалось:

book = Book.new
author = Author.new
author.books << book
author.books.include?(book) # true, as expected
author.books.empty? # false, as expected
book.author == author # true, as expected

Это ожидаемое поведение?Я не совсем понимаю, почему в первом случае не сохраняется ассоциация от author до book.

Я использую ruby ​​2.5.1 и rails 5.2.0.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

author.books << book строит ActiveRecord::Associations::CollectionProxy.Таким образом, с помощью author.books.include? book вы проверяете, существует ли он внутри этой коллекции (еще не хранится в БД): это правда.

С помощью book.save вы можете сохранить как book, так и author.

И наоборот, book.author = author - это просто задание.Вам необходимо author.save и book.save, чтобы эффективно построить отношения.Если вы проверяете author.books.include? (Книга) после двух сохранений, если становится истинным.

Попробуйте это в консоли rails.

...