То, как ActiveRelation будет влиять на направляющие, включает () возможности?

Я просмотрел источники 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)
7
задан divibisan 22 August 2018 в 17:12
поделиться

2 ответа

ActiveRecord::Relation является довольно слабой оберткой вокруг Base#find_by_sql, поэтому запросы :include никак не расширяются его включением.

3
ответ дан 7 December 2019 в 05:18
поделиться

Почему бы вам не использовать 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 Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или она была недостаточно описательной для вас.

Будущее с Арел выглядит светлым.

4
ответ дан 7 December 2019 в 05:18
поделиться
Другие вопросы по тегам:

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