has_many: сквозная - сложная модель - PullRequest
1 голос
/ 07 октября 2011

У меня довольно сложный набор моделей, и я пытаюсь выяснить, как все это настроить, чтобы рельсы генерировали цепочечные запросы (хотя я не уверен, что это возможно).Таким образом, мой вопрос в конечном итоге звучит так: как мне их объединить ИЛИ как правильно разбить на страницы этот тип функции?

Во-первых, обзор высокого уровня.

Это «социальная сеть» иУ меня есть пользователи, которые могут быть students или teachers.Students и teachers могут следовать друг за другом.Оба могут также делать вещи на сайте, которые приводят к activity_items.Студенты могут принадлежать учителю.Поэтому, если ученик следует за учителем, он также должен увидеть activity_items учеников под этим учителем.

И вот тут все усложняется.Я пытаюсь выяснить, как отобразить фид активности.

Теперь модели:

model ActivityItem < ActiveRecord::Base
  belongs_to :profile, :polymorphic => :true
  attr_accessor :posted_by_user
end

model Following < ActiveRecord::Base
  belongs_to :profile, :polymorphic => true
  belongs_to :following, :polymorphic => true
end

model Student < ActiveRecord::Base
  has_many :following_relationships, :as => :profile, :class_name => "Following"
  has_many :follower_relationships, :as => :following, :class_name => "Following"

  # getting the actual student/teacher model for each relationship
  def following
    self.following_relationships.reset
    following_relationships.collect(&:following)
  end

  def activity_feed
    all = following
    all.inject([]) do |result,profile|
      result | profile.activity_items
    end
  end

end

model Teacher < ActiveRecord::Base
  [same as student, really it is in an Extension]
end

Поэтому метод, который меня больше всего беспокоит, это activity_feed.Без выполнения большого набора запросов каждый раз, я не уверен, как разбить данные на страницы.У меня есть еще несколько методов, которые проходят через каждый Activity_item и устанавливают posted_by_user в true или false, чтобы сообщить мне, если это - Activity_item, созданный кем-то, за кем они следуют прямо или косвенно (через учителя).

Как я могу изменить это так, чтобы я мог либо

(A) получить один (или два или три) запроса, чтобы я мог выполнить метод нумерации страниц.

(Б) как правильно кэшировать / разбивать на страницы большой набор данных, как этот?

...