Соглашение об именах Rails для таблицы соединений
Эти вопросы связаны с: Как связать форму после создания таблицы соединений рельсов
Я создаю таблицу соединений между моими продуктами и категориями.
Как должна быть названа таблица соединений? category_products или category_products или что-то еще?
Ответы
Ответ 1
categories_products
. Оба множественного числа. В лексическом порядке.
Цитата:
Если имя таблицы соединения не указано явно, используя: параметр join_table, Active Record создает имя, используя лексический порядок имен классов. Итак, соединение между клиентом и заказом модели дадут имя таблицы соединений по умолчанию "customers_orders" потому что "c" превосходит "o" в лексическом порядке.
Ответ 2
Рельсы 4
Обратите внимание, что из Rails 4 появляются новые правила.
Определяет отношения "многие-ко-многим" с другим классом. Это связывает два класса через промежуточную таблицу соединений. Если таблица соединений явно не указана в качестве опции, ее предполагается использовать с лексическим порядком имен классов. Таким образом, соединение между Developer и Project даст имя таблицы соединений по умолчанию для "developers_projects", потому что "D" предшествует "P" в алфавитном порядке.
Обратите внимание, что этот приоритет вычисляется с использованием < оператора для Строка. Это означает, что если строки имеют разную длину и строки равны при сравнении с кратчайшей длиной, тогда более длинная строка рассматривается с более высоким лексическим приоритетом, чем более короткий. Например, можно было бы ожидать, что таблицы "paper_boxes" и "документы" для создания имени таблицы объединений "papers_paper_boxes" из-за длины имени "paper_boxes", но это на самом деле генерирует имя таблицы соединений "paper_boxes_papers". Помните об этом предостережение и используйте параметр custom: join_table, если вам нужно.
Если ваши таблицы имеют общий префикс, он будет отображаться только один раз на начало. Например, таблицы "catalog_categories" и "catalog_products" генерирует имя таблицы соединений "catalog_categories_products".
= > Docs for Rails v4.2.7
# alphabetically order
developers + projects --> developers_projects
# precedence is calculated with '<', lengthier strings have precedence
# if the string are equal compared to the shortest length
paper_boxes + papers --> paper_boxes_papers
# common prefix omitted
catalog_categories + catalog_products --> catalog_categories_products
Рельсы 5
Правило по-прежнему остается одним и тем же. С Rails 5 у нас есть новый помощник для создания таблиц соединений с миграциями:
class CreateDevelopersProjectsJoinTable < ActiveRecord::Migration[5.0]
def change
create_join_table :developers, :projects
end
end
= > Edge docs для Rails
Ответ 3
Объединение таблиц в Rails должно создаваться только в алфавитном порядке. Помните об этом при каждом создании таблицы соединений.
Например, если вы хотите создать таблицу соединений между таблицей проекта и таблицей соавторов, вы должны называть ее, как показано ниже.
Синтаксис: first_table_name(UNDERSCORE)second_table_name
# Names must be in alphabetical order and also in plural
# Decide which is your first table name based on the alphabetical order
Пример: Создание таблицы объединения между Project и Collaborator
Collaborator-Project
collaborators_projects
# you should name it like this; In alphabetical order with plural names
Пример 2: Создание таблицы соединений между таблицей BlogPost и таблицей пользователей
BlogPost-User
blog_posts_users # In alphabetical order with plural names