Проблемы с энергичной загрузкой связанных объектов "второй степени" - PullRequest
2 голосов
/ 09 марта 2012

Я использую Ruby on Rails 3.1. Я бы хотел загружать связанные объекты «второй степени», применяя некоторые условия, но у меня проблемы.

Кажется, я уже решил часть моей проблемы , используя:

article_categories =
  article
    .categories
    .includes(:comments => [:category_relationships])
    .where(:category_relationships => {:user_id => @current_user.id})

где участвующие классы указаны следующим образом:

class Category < ActiveRecord::Base
  has_many :comment_relationships
  has_many :comments,
    :through => :comment_relationships

  ...
end

class Comment < ActiveRecord::Base
  has_many :category_relationships
  has_many :categories,
    :through => :category_relationships

  ...
end

Приведенный выше код (похоже, все делает правильно):

  1. загружает все categories, заботясь об ассоциации has_many :through :category_relationships (то есть, заботясь о состоянии .where(:category_relationships => {:user_id => @current_user.id}));
  2. нетерпеливо загружает все article.comments.where(:user_id => @current_user.id).

Однако я хотел бы сделать еще немного:

  1. до порядок извлекается categories с помощью атрибута :position, присутствующего в category_relationships, так что результирующие article_categories упорядочены по позиции ;
  2. до нетерпеливая загрузка также category_relationship объектов, где user_id == @current_user.id, поскольку приведенный выше код этого не делает.

Как это сделать, воспользовавшись энергичной загрузкой?

1 Ответ

0 голосов
/ 24 апреля 2012

Решение:

  1. .order ("category_relationships.position")

  2. Представьте, что готовая загрузка - это декартово произведение с некоторой фильтрацией, поэтому "где "фильтрует конечный результат include (действительно, оставлено соединение).Но это можно сделать с помощью where с помощью подзапроса, который сначала отфильтрует категории по пользователю, а затем удалит ваше местоположение.

...