Що таке Arel in Rails 3.0?


86

Я розумію, що це заміна ActiveRecord і що вона використовує об’єкти замість запитів.

Але ...

чому це краще?

чи буде "простіше" створювати об'єкти / запити?

чи це призведе до більш ефективних запитів SQL?

чи буде він сумісним з усіма основними БД? - Я припускаю, що буде.

це буде простіше / важче використовувати із збереженими процедурами?

Відповіді:


182

Що таке Arel in Rails 3.0?

Це об’єктна модель для алгебри операторів реляційних запитів.

Я розумію, що це заміна ActiveRecord

Ні, це не так. Це заміна ручної обробки SQL-запитів у рядках. Це загальний рівень запиту, який лежить в основі ActiveRecord, але його також можна використовувати як підґрунтя для DataMapper, наприклад.

Якщо це будь-яка заміна, це заміна Ambition. Або ви можете сприймати це як версію Ruby стандартних операторів запитів LINQ або SQLAlchemy Python. (Насправді автор наводить як LINQ, так і SQLAlchemy як натхнення.)

Або ви можете розглядати це як заміну named_scopes. Насправді ARel є майже реалізацією ідеї, що "кожен запит - це named_scope". І, whaddayaknow: обидва написані одним і тим же хлопцем.

і що він використовує об’єкти замість запитів.

Ні, він використовує об’єкти як запити.

чому це краще?

Ruby є об'єктно-орієнтованою мовою, а не мовою, орієнтованою на рядки. З цієї причини в поодинці , має сенс подавати запити в вигляді об'єктів замість рядків. Створення належної об'єктної моделі для запитів замість використання рядків для всього дає майже такі ж переваги, як і створення належної об'єктної моделі для облікової системи замість використання рядків для всього.

Ще однією великою перевагою є те, що ARel реалізує фактичну алгебру операторів запитів. Іншими словами, ARel знає про математичні правила побудови та складання запитів. Якщо ви об'єднаєте два рядки, кожен з яких містить допустимий запит SQL, результат, ймовірно, не буде дійсним запитом SQL. Або, що ще гірше, це є допустимим запит SQL, але один , який не має сенсу, або що робить що - щось зовсім відмінне від того, що ви думаєте , що він робить. З ARel цього ніколи не може статися. (Це те, що стаття, на яку я посилаюся нижче, означає "закрита під композицією".)

чи буде "простіше" створювати об'єкти / запити?

Так. Наприклад, як я вже згадував вище, набагато простіше побудувати більш складні запити з більш простих частин.

чи це призведе до більш ефективних запитів SQL?

Так. Той факт, що ARel має належну об'єктну модель для запитів, означає, що він може виконувати оптимізацію цих запитів задовго до того, як коли-небудь генерує фактичний запит SQL.

чи буде він сумісним з усіма основними БД? - Я припускаю, що буде.

Так. Насправді, я завжди говорив про SQL вище, але насправді реляційна алгебра запитів може генерувати запити майже для всього. Знову ж, див. LINQ або Ambition як приклади: обидва можуть запитувати SQL, LDAP, ActiveResource, CouchDB, Amazon, Google,… з однаковим синтаксисом.

Мабуть, найкращою дискусією щодо того, що таке ARel і чому писав Нік Каллен, є доречно названа стаття Why Arel? самим Ніком Калленом . Примітка: стаття містить деякий м'який математичний та інформатичний жаргон, але саме в цьому полягає суть: ARel має кілька міцних основ в математиці та інформатиці, саме ці основи надають йому його потужні властивості.


Прекрасна відповідь. Я прочитав посилання, яке ви розмістили, і здебільшого переходив за ним. Насправді комп’ютерна частина мала сенс, але те, як вона була включена в рейки, була там, де я мав проблеми. Мені набагато більше сенсу, що він замінює вручну створений SQL (або що завгодно) і, отже, AR будується поверх нього в 3.0. У мене склалися різні враження у людей, які повинні знати краще, і ця відповідь блискуча своїм простим і точним поясненням кожного вищезазначеного питання.
Буде

У мене є одне наступне запитання. Ви згадали вище про LDAP, AMZ тощо, я припускаю, що в даний час (на основі rails / arel на github) ARel не має такої можливості, а лише потенціал? тобто поки хтось не реалізує цю частину. Це звучить надзвичайно захоплююче.
Буде

2
@Will - Я думаю, вам доведеться чекати, поки хтось розвине ці більш прикольні можливості. Або взяти тріщину на себе самостійно, вам це потрібно?
Майк Вудхаус,

1
+1, хоча посилання мертве; наївний пошук не знайшов поточного посилання.
Dave Newton

@DaveNewton: Мабуть, його вже немає. Навколо плавають деякі кешовані копії, наприклад bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W

19

ARel, на жаль, пов’язаний безпосередньо з генерацією SQL і, отже, не підходить для потреб DataMapper.

Я б сказав, що ARel - це явна модель запитів для ActiveRecord, яка генерує та оптимізує SQL-запити для СУБД.

DataMapper, з іншого боку, є справжнім картографом для даних і вже може взаємодіяти з нереляційними сховищами даних. У майбутньому DataMapper, швидше за все, буде включати окрему бібліотеку під назвою Veritas, яка призначена забезпечити реляційну функціональність для даних, що надходять із БУДЬ-ЯКОГО сховища даних, а не лише RDBMS.


2
Чому це отримало -1?
Джеріко

10
Я є супровідником DataMapper, і те, що сказано в теорії, є правдою. ARel, в його поточній реалізації, не може бути використаний під DataMapper, оскільки він надає лише підмножину функціональних можливостей, необхідних для роботи з 40+ сховищами даних, які підтримує DM. Поточна реалізація IMHO тісно пов'язана з генерацією SQL, і знадобиться багато роботи, щоб виправити API / внутрішні елементи для роботи з сховищами даних, що суттєво відрізняються від СУБД. ARel - це крок вперед, але на даний момент він не може стати основою для більш ніж ActiveRecord.
dkubb

1

Arel у Rails 3 робить об’єкти відношення, де db не запитується, доки це вам не потрібно. Набагато ефективніше.

Це також більш природно (як тільки ви звикнете), що насправді є великою силою рейок.


0

Насправді я розпочав відеосеріал на ActiveRelation.

Перший загальний підручник можна переглянути за адресою http://Innovative-Studios.com/#pilot


Мені теж сподобалось відео. Це було якось базово, але я зібрав кілька шматочків додаткової нової інформації. Хотіли б побачити наступні відео!
Purplejacket
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.