Вот несколько мыслей, которые могут помочь вам в этом. Я больше знаком с ActiveRecord, чем Sequelize, поэтому я буду работать с этим, но концепции должны быть одинаковыми для обоих.
У вас есть база данных. Вы можете полностью не зависящий от Rails (например, с помощью инструмента администрирования базы данных), запустите и запустите запрос в этой базе данных - что-то вроде "select * from users limit 1"
. Но это просто дает вам набор результатов в каком-то окне администратора, которые не очень полезны для вашего приложения Rails. Вы хотите иметь возможность выполнять SQL из своего приложения Rails и получать данные обратно в форме, с которой Ruby/Rails может работать. Вам нужно Access
вашего Data
через какой-то рубин Object
- вам нужно Data Access Object
, или DAO
.
В рельсам, можно выполнить запрос выше что-то вроде:
result = ActiveRecord::Base.connection.execute("select * from users limit 1")
Переменная result
не будет знать или заботиться о вашей User
модели. Все это будет содержать, по существу, список равнины рубина Hash
случаев, как:
{
"id" => "1234",
"email" => "[email protected]",
"first_name" => "Fred",
"last_name" => "Flintstone",
}
Если вы хотите обновить first_name
к Bob
, вы можете не только редактировать этот хэш и вызвать экономить на нем - это просто простой старый хеш, только данные и никаких дополнительных умений. Таким образом, вы должны написать свой собственный SQL снова, и получить Rails выполнить это для вас:
ActiveRecord::Base.connection.execute("update users set first_name = 'Bob' where id = 1234")
Так что вы используете в этом контексте в основном только рейл DAO
, без использования его ORM
.
ORM
подобен слою на DAO
. У вас может быть DAO
без ORM
, но у вас не может быть ORM
без DAO
. ORM
, или Object Relational Mapper
будет Map
концепций/записей в вашей Relational
базе данных с Objects
на вашем языке программирования (т. Е. Ruby). Итак, если вы хотите, чтобы сделать вещи выше, используя рейл ORM
, а не использовать его DAO
, это может выглядеть следующим образом:
user = User.find(1234)
user.name = 'Bob'
user.save!
Посмотрите, как гораздо лучше, она использует ОРМ?Теперь фрагмент выше, используя ORM, по существу будет просто выполнять тот же SQL, который мы подробно описали ранее. ORM просто абстрагирует больше деталей и предоставляет более интеллектуальные объекты, чтобы сэкономить нам кучу дополнительной работы.
Опять же, продемонстрированные концепции можно перенести в Sequelize/Javascript и другие langs/frameworks.
Так что DAO
- это всего лишь «объект, который может выполнять SQL и возвращать результаты в некоторую базовую структуру данных, родную для языка программирования». В ORM
в конечном итоге будет использоваться DAO
для связи с базой данных, но он обеспечивает намного больше возможностей.
«Необработанные запросы» - это [конкретный пример] (http://docs.sequelizejs.com/manual/tutorial/models-usage.html#raw-queries), в котором Sequelize.js упоминает 'DAO':'// Ожидаете ли вы массивный набор данных из БД, // и не хотите тратить время на создание DAO для каждой записи? // Вы можете передать дополнительный запрос для получения необработанных данных: Project.findAll ({где: {...}, raw: true}) ' –