Я просмотрел источники Arel, и некоторые activerecord источники для направляющих 3.0, но я, может казаться, не подбираю хороший ответ для меня относительно того, будет ли Arel изменяться, наша способность использовать включает (), при построении запросов, к лучшему.
Существуют экземпляры, когда можно было бы хотеть изменить условия на activerecord: включайте запрос в 2.3.5 и прежде для записей ассоциации, которые были бы возвращены. Но насколько я знаю, это не программно надежно для всех: включайте запросы:
(Я знаю, что некоторые AR-find-includes делают t# {n} .c# {m}, переименовывает для всех атрибутов, и можно было очевидно добавить условия к этим запросам для ограничения результатов присоединенных наборов; но другие делают n_joins + 1 количество запросов по идентификационным наборам многократно, и я не уверен, как можно было бы взломать AR для редактирования этих выполненных с помощью итераций запросов.)
Arel позволит нам создавать запросы ActiveRecord, которые указывают получающиеся связанные объекты модели, когда использование включает ()?
Исключая:
User :has_many posts( has_many :comments)
User.all(:include => :posts) #say I wanted the post objects to have their
#comment counts loaded without adding a comment_count column to `posts`.
#At the post level, one could do so by:
posts_with_counts = Post.all(:select => 'posts.*, count(comments.id) as comment_count',
:joins => 'left outer join comments on comments.post_id = posts.id',
:group_by => 'posts.id') #i believe
#But it seems impossible to do so while linking these post objects to each
#user as well, without running User.all() and then zippering the objects into
#some other collection (ugly)
#OR running posts.group_by(&:user) (even uglier, with the n user queries)
ActiveRecord::Relation является довольно слабой оберткой вокруг Base#find_by_sql, поэтому запросы :include никак не расширяются его включением.
Почему бы вам не использовать AREL как ядро? Как только вы перейдете к фактической области видимости таблицы, вы сможете использовать Arel :: Relation, которая ПОЛНОСТЬЮ отличается от самой реализации ActiveRecord.Я искренне верю, что ActiveRecord :: Relation - это ПОЛНОСТЬЮ отличная (и разорванная) реализация оболочки вокруг Arel :: Relation и Arel :: Table. Я предпочитаю использовать Arel в своей основе, либо выполняя Thing.scoped.table (Arel :: Table), который является активным стилем записи, ИЛИ Arel :: Table.new (: table_name), который дает мне свежий Arel :: Table (мой предпочтительный метод). Из этого вы можете сделать следующее.
posts = Arel::Table.new(:thing, :as => 'p') #derived relation
comments = Arel::Table.new(:comments, :as => 'c') # derived relation
posts_and_comments = posts.join(comments).on( posts[:id].eq(:comments[:id]) )
# now you can iterate through the derived relation by doing the following
posts_and_comments.each {...} # this will actually return Arel::Rows which is another story.
#
Arel :: Row возвращает ИСТИННОЕ определение кортежа из набора, который будет состоять из Arel :: Header (набор атрибутов Arel :: Attributes) и кортежа.
Также немного более подробным, причина, по которой я использую Arel в его основе, заключается в том, что он действительно раскрывает мне реляционную модель, которая является мощью ActiveRelation. Я заметил, что ActiveRecord раскрывает около 20% того, что может предложить Arel, и я боюсь, что разработчики не поймут это НИ-ИЛИ, если они поймут истинное ядро реляционной алгебры. Использование хэша условий для меня «старая школа» и программирование в стиле ActiveRecord в мире реляционной алгебры. Как только мы научимся отказываться от подхода, основанного на модели Мартина Фаулера, и принять подход, основанный на реляционной модели Э. Ф. Кодда, это фактически то, что РСУБД пытались делать в течение десятилетий, но очень ошибались.
Я взял на себя смелость начать серию из семи частей по Арелу и реляционной алгебре для сообщества рубинов. Они будут состоять из коротких видеороликов, начиная от абсолютно новичков и заканчивая продвинутыми техниками, такими как ссылки на себя и завершение под композицией. Первое видео находится на http: // Innovative-Studios.com / # pilot Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или она была недостаточно описательной для вас.
Будущее с Арел выглядит светлым.