Как ActiveRelation повлияет на возможности rails' includes ()?

Я просмотрел источники Arel и некоторые из источников activerecord для Rails 3.0, но я не могу получить хороший ответ для себя о том, будет ли Arel изменять нашу способность использовать includes () при построении запросов к лучшему.

есть случаи, когда может потребоваться изменить условия в activerecord: include query в 2.3.5 и ранее для записей ассоциации, которые будут возвращены. Но насколько я знаю, это не программно tenable for all: include queries:

(Я знаю, что некоторые AR-find-includes делают t#{n}.C#{m} переименовывает все атрибуты, и можно было бы предположительно добавить условия к этим запросам, чтобы ограничить результаты Объединенных наборов; но другие делают n_joins + 1 Количество запросов над наборами идентификаторов итеративно, и я не уверен, как можно взломать AR для редактирования этих итерационных запросов.)

позволит нам построить запросы ActiveRecord, которые задают результирующие связанные объекты модели при использовании includes ()?

Ex:

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)

3 ответов


почему вы на самом деле не используете AREL в своей основе. Как только вы перейдете к фактической области таблицы, вы можете использовать отношение Arel::, которое полностью отличается от самой реализации ActiveRecord. Я действительно считаю, что ActiveRecord::Relation-это совершенно другая (и сломанная) реализация оболочки вокруг Arel::Relation & Arel::Table. Я выбираю использовать Arel по своей сути, либо делая что-то.прицел.таблица (Arel::Table), которая является активным стилем записи или Arel:: Таблица.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:: (набор атрибутов Arel::) и кортежа.

также немного более подробно, причина, по которой я использую Arel в его основе, заключается в том, что он действительно предоставляет мне реляционную модель, которая является силой, стоящей за ActiveRelation. Я заметил, что ActiveRecord разоблачает как 20% того, что может предложить Arel, и я боюсь, что разработчики не поймут этого и не поймут истинное ядро реляционной алгебры. Использование хэша условий для меня "старая школа" и программирование стиля ActiveRecord в мире реляционной алгебры. Как только мы научимся отрываться от подхода, основанного на модели Мартина Фаулера, и принять подход, основанный на реляционной модели E. F. Codd, это на самом деле то, что РСУБД пытались сделать в течение десятилетий, но получили очень неправильно.

Я взял на себя смелость начать серию из семи частей по Arel и реляционной алгебре для сообщества ruby. Они будут состоять из коротких видеороликов, начиная от абсолютного новичка до передовых методов, таких как самореферентные отношения и закрытие под композицией. Первое видео находится вhttp://Innovative-Studios.com/#pilot пожалуйста, дайте мне знать, если вам нужна дополнительная информация или это не было достаточно описательным для вас.

будущее выглядит ярко с Арел.


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


не

Post.includes([:author, :comments]).where(['comments.approved = ?', true]).all

то, что вы ищете? (взято у чиновника docs)