Существуют разные типы таблиц, и в зависимости от отношения, которое вы хотите между ними, вам нужно будет соответствующим образом настроить таблицу. Я рассмотрю следующие типы отношений: own_to, has_many и has_many: through.

Для ассоциации принадлежит_к; мы хотим иметь внешний ключ в таблице, которой он принадлежит (как показано на рисунке выше). Чтобы определить, хотите ли вы, чтобы для модели была установлена ​​связь own_to; Сначала вы захотите узнать, нужен ли таблице внешний ключ (author_id в приведенном выше примере). Убедитесь, что класс, к которому он принадлежит, является сингулярным, потому что выбранная нами модель может принадлежать только одной сингулярной модели. Если бы мы использовали это, мы бы сделали что-то вроде этого:

book1 = Book.find (1) ‹- это зафиксирует сообщение переменной в книге с этим номером идентификатора. Теперь, если мы предположим, что мы уже создали книгу с author_id равным 3.

book1.author ‹- вернет объект Author с идентификатором 3 и всю информацию вместе с ним. Если мы хотим быть более конкретными, мы могли бы добавить ".name" после автора в примере, чтобы просто получить имя. Или используйте конкретное имя столбца, чтобы получить соответствующие данные.

book1.author.name ‹- возвращает имя автора, которое было сохранено.

book1.author.id ‹- вернет id автора. что в данном случае будет 3.

Теперь другой стороной будет ассоциация has_many. В этом примере один автор может опубликовать много книг. При написании ассоциации убедитесь, что объект имеет множественное число (как показано выше). Предположим, мы используем тот же пример, что и принадлежит. Теперь, чтобы вызвать ассоциацию, мы хотели бы использовать что-то вроде этого:

author3 = Author.find_by (id: 3) ‹- найдет автора с идентификатором 3 и установит его в качестве переменной« author ».

author3.books ‹- появится массив объектов, связанных с этим конкретным автором. Если вы тестируете это и получаете пустой массив ([]), это, скорее всего, будет означать, что с этим автором еще нет книг.

Если нам нужны названия книг, мы не можем использовать author3.books.title, если мы не указали, какое название книги нам нужно.

author3.books.first.title ‹- вызовет название первой книги в массиве книг для этого автора.

Теперь что касается has_many: through, мы будем использовать приведенный выше пример. Эта ассоциация использует объединенную таблицу (Встреча) для соединения других таблиц (Врач и Пациент). При создании ассоциации всегда ставьте модель объединения на первое место (знак «=› »не требуется). Как видите, у врача и таблицы пациента нет внешних ключей. Но вместо этого у нас есть таблица встреч с внешними ключами. Это будет то, что мы используем для установления отношений между врачом и пациентом. Чтобы использовать это, мы хотели бы использовать что-то вроде этого для его вызова.

Предположим, мы создали переменные с именами «пациент1» и «врач1», используя .find (1) для обоих. Оба они будут объектом с идентификатором 1.

assignment = Appointment.create (Patient_id: 1, Physician_id: 1, assign_date: 12/12/2020) ‹- этим мы создали связь между двумя другими объектами. А поскольку у нас есть отношения, у нас есть возможность позвонить другому.

Patient1.physICAL ‹- возвращает массив всех объектов врача, связанных с назначениями пациента; и то же самое можно было бы использовать с doctor1, чтобы найти группу пациентов. Если вы получили пустой массив, это, вероятно, означает, что связь еще не создана.

Patient1.appointments ‹- это принесет массив встреч, который соответствует этой переменной.

Patient1.appointments.last.appointment_date ‹- получит дату соответствующей встречи.

Patient1.appointments.first.physician ‹- вызовет объект врача (вместо массива), который принадлежит первому визиту в массиве встреч для пациента1.

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

Ссылка на другие таблицы и ассоциации: https://guides.rubyonrails.org/association_basics.html