2015-01-02 3 views
0

у меня есть модель пользователясложный запроса для загрузки записей из нескольких вложенных записей

class User < ActiveRecord::Base 
    has_many :watched_videos 
    has_and_belongs_to :course 
end 

и модель курса

class Course < ActiveRecord::Base 
    has_many :videos  
    has_and_belongs_to :users 
end 

и видео модель

class Video < ActiveRecord::Base 
    belongs_to :course 
    has_many :watched_videos  
end 

и мой wathed видео модель выглядит как

class WatchedVideo < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :video  
end 

Я хочу, чтобы все те курсы, которые все видео просматривали пользователь. например. Есть два курса с двумя видеороликами каждый, и пользователь видел все видео, конечно, один, и мой запрос должен вернуть этот курс. Как я могу это реализовать?

ответ

0

Во-первых получить все пользователи, которые уже просмотрели любое видео:

users = WatchedVideo.pluck('Distinct("user_id")') 

Fetch все курсы, которые имеют выше пользователей:

courses = Course.includes(:videos).where('user_id in (?)', users) 

перебрать курсы, чтобы найти курс, который все видео смотрят:

cour = [] 
courses.each do |c| 
c.users.each do |u| 
    cour << c if u.wathced_videos.pluck(:video_id) == c.videos.pluck(:id) 
end 
end 

Существует область для оптимизации. Вы можете оптимизировать это далее

Смежные вопросы