У меня довольно сложный набор моделей, и я пытаюсь выяснить, как все это настроить, чтобы рельсы генерировали цепочечные запросы (хотя я не уверен, что это возможно).Таким образом, мой вопрос в конечном итоге звучит так: как мне их объединить ИЛИ как правильно разбить на страницы этот тип функции?
Во-первых, обзор высокого уровня.
Это «социальная сеть» иУ меня есть пользователи, которые могут быть 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) получить один (или два или три) запроса, чтобы я мог выполнить метод нумерации страниц.
(Б) как правильно кэшировать / разбивать на страницы большой набор данных, как этот?