Rails обновляет author_id в таблице книг после удаления и создания новой записи автора - PullRequest
0 голосов
/ 25 сентября 2019

Вот модель Author и модель Book

class Author < ApplicationRecord
  has_many :books, dependent: :destroy
end

class Book < ApplicationRecord
  belongs_to :author
end

Я создаю 2 авторов (author1 & author2) и добавляю по 2 книги для каждого.

После этого я удалил author1 и создал нового автора (author3).Теперь я хочу дать author3 две книги author1.

Существует ли метод ActiveRecord для обновления книг author_id новым автором?

Ответы [ 2 ]

5 голосов
/ 25 сентября 2019

Я бы порекомендовал вам сначала создать второго автора.Если вы сначала удалите первого автора, то вы не сможете получить книги, связанные с первым автором.

Найти нового автора

new_author = Author.find(new_id)

Изменить книги старого авторана новый

old_author = Author.find(old_id)
old_author.books.update_all(author_id: new_author.id)

Удалить старого автора

old_author.destroy

Это будет гарантировать, что никакие данные не будут потеряны, а также нет потерянных данных.

0 голосов
/ 25 сентября 2019

Звучит так, будто вы хотите, чтобы объект книги остался после удаления автора, чтобы вы могли затем назначить его другому автору.Если это так, вы можете рассмотреть возможность использования атрибута has и принадлежит многим отношениям: https://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association. Таким образом, у вас будет 3 таблицы: authors, books и authors_books.author_books будет иметь только 2 столбца: author_id и book_id.

Другой вариант - изменить Author следующим образом:

  class Author < ApplicationRecord
    has_many :books, dependent: :nullify
  end

Теперь, когда автор удаленкниги не удаляются, вместо этого author_id устанавливается в ноль в таблице книг для всех книг, которые ранее принадлежали определенному автору: https://guides.rubyonrails.org/association_basics.html#dependent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...