Rails ActiveRecord Relationships - PullRequest
       4

Rails ActiveRecord Relationships

1 голос
/ 28 марта 2009

Как магически функционируют отношения, когда изменяются только модели?

Если мне нужно отношение "has__and___belongs___to__many", как я должен назвать таблицу (чтобы Rails мог ее использовать), которая содержит два внешних ключа?

Ответы [ 3 ]

2 голосов
/ 28 марта 2009

Краткий ответ: Вы не можете просто сказать моделям, что они связаны; для этого тоже должны быть столбцы в базе данных.

Когда вы устанавливаете связанные модели, Rails предполагает, что вы следовали соглашению, которое позволяет ему находить написанные вами вещи. Вот что происходит:

  1. Вы настраиваете таблицы.

    Следуя соглашениям в Rails, вы называете таблицу определенным, предсказуемым образом (существительное во множественном числе, например, people). В этой таблице, когда у вас есть отношение к другой таблице, вы должны создать этот столбец и назвать его другим предсказуемым способом (например, bank_account_id, если вы относитесь к таблице bank_accounts).

  2. Вы пишете класс модели, унаследованный от ActiveRecord :: Base

    class Person < ActiveRecord::Base

    Когда вы создаете экземпляр одной из этих моделей, конструктор ActiveRecord :: Base просматривает имя класса, преобразует его в нижний регистр и приумножает. Здесь, читая Person, вы получите people, имя таблицы, которую мы создали ранее. Теперь ActiveRecord знает, где можно получить всю информацию о человеке, и может прочитать выходные данные SQL, чтобы выяснить, что такое столбцы.

  3. Вы добавляете отношения к модели: has_many, belongs_to или has_one.

    Когда вы набираете что-то вроде has_many :bank_accounts, это предполагает несколько вещей:

    1. Название модели, к которой вы относитесь, - BankAccount (из верблюжьей шкуры :bank_accounts).

    2. Имя столбца в таблице people, которое относится к банковскому счету, равно bank_account_id (из единственного числа :bank_accounts).

    3. Так как отношение has_many, ActiveRecord знает, как предоставить вам методы, подобные john.bank_accounts, используя множественные имена для вещей.

Собирая все это вместе, ActiveRecord знает, как делать SQL-запросы, которые дадут вам банковские счета человека. Он знает, где найти все, потому что вы следовали соглашению об именах, которое он понимает при создании таблицы и ее столбцов.

Одна из замечательных особенностей Ruby состоит в том, что вы можете запускать методы для всего класса, и эти методы могут добавлять другие методы в класс. Это именно то, что has_many и друзья делают.

2 голосов
/ 28 марта 2009

Это работает, потому что вы следуете «Соглашению о конфигурации».

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

Если вы следовали этим соглашениям, то rails будет их использовать и сможет собрать необходимый SQL, чтобы найти все заказы для данного клиента.

Если вы посмотрите файл development.log при разработке вашего приложения, вы сможете увидеть, как создается необходимый SQL для выбора всех заказов для данного клиента.

Rails не создает таблицы без вашего ведома. Создание таблиц достигается путем создания миграции, которая будет создавать / изменять таблицы для вас. Тот факт, что вы создаете модель клиента, а затем утверждаете, что она has_many: orders, не создаст вам таблицу заказов. Вам нужно будет сделать это для себя самостоятельно в рамках миграции, чтобы создать таблицу заказов. В рамках этой миграции вам нужно будет либо добавить столбец customer_id, либо использовать инструкцию own_to: customer, чтобы добавить поле customer_id в таблицу заказов.

0 голосов
/ 28 марта 2009

направляющая для этого очень полезна

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