Что такое Ruby on Rails ORM в терминах неспециалиста? Объясните

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

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

Я - Веб-разработчик, идущий от PHP до Ruby on Rails.

9
задан tereško 8 February 2014 в 10:24
поделиться

7 ответов

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

-

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

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

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

"Также что такое модель? Я знаю, что она отображает таблицу"

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

  • Validations: Кроме типичных db-управляемых валидаций ("это поле не может быть нулевым") вы можете реализовать много сложных валидаций в рубине ("это поле должно быть действительным электронным письмом" является наиболее типичным). Валидации выполняются непосредственно перед вызовом "save" на экземпляре модели.
  • Relationships: Иностранные ключи также могут быть нанесены на модели. Например, если бы у вас была таблица brands (с соответствующей моделью Brand), связанная через посторонний ключ с вашим форд-клиентом, вы могли бы сделать ford.brands и вы бы получили массив объектов, представляющих все записи в таблице брендов, которые имеют client_id = 1.
  • Queries: Модели позволяют создавать запросы в рубине и сами транслировать их на SQL. Большинству людей нравится эта возможность.

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

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

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

  • Модели обрабатывают взаимодействие с базами данных, а бизнес-логика
  • Видов обрабатывают рендеринг html и взаимодействие с пользователями
  • Контроллеры соединяют модели с видами
24
ответ дан 4 December 2019 в 06:09
поделиться

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

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

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

Дополнительная литература

15
ответ дан 4 December 2019 в 06:09
поделиться

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

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

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

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

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

1
ответ дан 4 December 2019 в 06:09
поделиться

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

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

С точки зрения PHP это будет следующим образом (через пример)

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

Вы можете определить отношения между таблицами, например, говоря: Posts has_many Comments, Комментарий принадлежит посту и так далее.

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

1
ответ дан 4 December 2019 в 06:09
поделиться

Проще говоря.

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

Выше находится ORM Rails ActiveRecord.

1
ответ дан 4 December 2019 в 06:09
поделиться

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

0
ответ дан 4 December 2019 в 06:09
поделиться

Models: Объекты домена, такие как User, Account или 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();
2
ответ дан 4 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: