Что такое Ruby on Rails ORM с точки зрения непрофессионала? Пожалуйста, объясни - PullRequest
9 голосов
/ 17 декабря 2009

У меня проблемы с пониманием ORM в Ruby on Rails. Из того, что я понимаю, есть связь 1: 1 между таблицами / столбцами и объектами / атрибутами. Таким образом, каждая запись является объектом. Кроме того, что именно модель? Я знаю, что это соответствует таблице.

Что мне действительно нужно, так это более глубокое понимание вышесказанного. Заранее благодарю за помощь

Я веб-разработчик и перехожу с PHP на Ruby on Rails.

Ответы [ 7 ]

24 голосов
/ 21 декабря 2009

"Из того, что я понимаю, есть связь 1: 1 между таблицами / столбцами и объектами / атрибутами. Таким образом, каждая запись является объектом."

Это не совсем правильно, если вы не используете термин «объект» очень свободно. Таблицы моделируются классами , в то время как таблица records моделируется экземплярами этих классов .

Допустим, у вас есть таблица clients со столбцами id (autonum) и name (varchar). Допустим, у него всего одна запись: id = 1 и имя = "Ford". Тогда:

  • Таблица БД clients будет сопоставлена ​​с классом модели Client.
  • Запись будет сопоставлена ​​с экземпляром модели , что означает, что вам нужно создать объект и присвоить его переменной для работы с записью. Наиболее распространенным способом было бы сделать ford = Client.find(1)
  • Два столбца таблицы будут сопоставлены с методами в переменной ford. Вы можете сделать ford.id, и вы получите 1. Вы можете сделать ford.name, и вы получите строку "Ford". Вы также можете изменить имя клиента с помощью ford.name = "Chevrolet", а затем зафиксировать изменения в базе данных с помощью ford.save.

«И что же такое Модель? Я знаю, что она отображается в таблице»

Модели - это просто классы с лотами очень полезных методов для управления вашей базой данных. Вот несколько примеров:

  • Проверки : Помимо типичных проверок на основе БД («это поле не может быть пустым»), вы можете реализовать много сложных проверок в ruby ​​(«это поле должно быть действительным адресом электронной почты» - наиболее типичный). Проверки выполняются непосредственно перед тем, как вы вызываете «save» для экземпляра модели.
  • Отношения : Внешние ключи также могут быть сопоставлены с моделями. Например, если у вас есть таблица brands (с соответствующей ей моделью Brand), связанная через внешний ключ с вашим клиентом ford, вы можете сделать ford.brands, и вы получите массив объектов, представляющих все записи в таблица брендов с идентификатором client_id = 1.
  • Запросы : Модели позволяют создавать запросы в ruby ​​и сами переводить их в SQL. Большинству людей нравится эта функция.

Это только некоторые примеры. Активная запись обеспечивает гораздо больше функций, таких как переводы, определение объема запросов или поддержка наследования одной таблицы.

И последнее, но не менее важное: вы можете добавлять свои собственные методы в эти классы.

Модели - отличный способ не писать "код спагетти", так как вы вынуждены разделять свой код по функциональности.

  • Модели обрабатывают взаимодействие с базой данных и бизнес-логику
  • Представления обрабатывают рендеринг HTML и взаимодействие с пользователем
  • Контроллеры соединяют модели с представлениями
15 голосов
/ 17 декабря 2009

ORM в Rails - это реализация шаблона Active Record из книги Patterns архитектуры корпоративных приложений Мартина Фаулера. Соответственно, инфраструктура Rails ORM называется ActiveRecord.

Основная идея заключается в том, что таблица базы данных обернута в класс, а экземпляр объекта соответствует одной строке в этой таблице. Таким образом, создание нового экземпляра добавляет строку в таблицу, обновление объекта обновляет строку и т. Д. Класс-оболочка реализует свойства для каждого столбца в таблице. В ActiveRecord Rails эти свойства становятся автоматически доступными с помощью метапрограммирования Ruby на основе схемы базы данных. Вы можете переопределить эти свойства, если требуется, если вам нужно ввести дополнительную логику. Вы также можете добавить так называемые виртуальные атрибуты , у которых нет соответствующего столбца в базовой таблице базы данных.

Rails представляет собой Model-View-Controller (MVC), поэтому модель Rails является M в MVC. Помимо описанного выше класса-оболочки ActiveRecord, он содержит бизнес-логику, в том числе логику проверки, реализованную модулем проверки ActiveRecord.

Дальнейшее чтение

2 голосов
/ 22 декабря 2009

Модели : доменные объекты, такие как User, Account или Status. Модели не обязательно поддерживаются бэкэндом базы данных, так как, например, Status может быть простым перечислением статического типа.

ActiveRecord

Предоставляет динамические методы для запроса таблиц базы данных. Таблица базы данных определяется как класс, который наследует класс ActiveRecord (пример псевдо-PHP):

class User extends ActiveRecord {}

//find a record by name, and returns an instance of `User`
$record = User::find_by_name("Imran");
echo $record->name; //prints "Imran"

//there are a lot more dynamic methods for quering

Новые записи создаются путем создания новых экземпляров наследуемых ActiveRecord классов:

class Account extends ActiveRecord {}

$account = new Account();
$account->name = "Bank Account"; 
$account->save();
1 голос
/ 17 декабря 2009

С точки зрения непрофессионала.

  • A Rails Модель является прокси для таблицы в базе данных. Эти модели являются классами Ruby.
  • Объекты этих классов являются прокси для строк в таблице, для которой эта модель является прокси.
  • Наконец, атрибуты этих объектов являются прокси для данных столбца для этой конкретной строки.

Выше на самом деле Rails ActiveRecord ORM.

1 голос
/ 17 декабря 2009

Здесь есть две части: ORM и шаблон MVC Rails. ORM - это сокращение от «объектно-реляционное отображение», и оно выполняет почти все, что говорит: оно отображает таблицы в вашей базе данных на объекты, с которыми вы можете работать.

MVC - это сокращение от «модель-представление-контроллер», шаблон, который описывает, как Rails превращает поведение вашего домена и представления объектов в полезные страницы. Шаблон MVC разбивается на три части:

  • Модели содержат определение того, что представляет собой объект в вашем домене и как он связан с другими моделями. В нем также описывается, как поля и отношения, представленные в объекте, сопоставляются с резервными хранилищами (такими как база данных). Обратите внимание, что, по сути, в модели нет ничего, что предписывало бы вам использовать определенный ORM (или даже ORM вообще).

  • Контроллеры определяют, как модели должны взаимодействовать друг с другом для получения полезных результатов в ответ на запрос пользователя.

  • Представления берут результаты, созданные контроллерами, и отображают их желаемым способом. (К тому времени, как вы дойдете до своего взгляда, вы в основном должны знать, что именно отображается, и поведения должно быть очень мало.)

1 голос
/ 17 декабря 2009

определение из Википедии:

Объектно-реляционное отображение (ORM, O / RM, и O / R mapping) в компьютерном программном обеспечении это техника программирования для преобразование данных между несовместимыми системы типов в реляционных базах данных и объектно-ориентированное программирование языки. Это создает, по сути, «база данных виртуальных объектов», которая может быть используется изнутри программирования язык.

В представлении PHP это будет следующим образом (на примере)

  1. Подключитесь к базе данных и получите строку из таблицы сообщений.
  2. Превратить эту строку в объект с такими же атрибутами, как в столбцах таблицы.
  3. Если у постов есть комментарии в таблице комментариев, вы также можете делать post.comments и получать комментарии также в виде массива объектов.

Вы можете определить отношения между таблицами, например: "Посты: комментарии", "Комментарии", комментарии принадлежат посту и так далее.

Таким образом, в основном вы не работаете со строками базы данных, вместо этого вы превращаете эти строки и их отношения в объекты со связями композиции или наследования.

0 голосов
/ 17 декабря 2009

1: 1 не совсем правильно, поскольку несоответствие импеданса отношения объекта .

...