diff --git a/app/controllers/tracks_controller.rb b/app/controllers/tracks_controller.rb index f592f42983bfa50c7af5ff4dae3d04e1ad8d2f97..cd438349cb8cb37c294385d6f7ee64f0fc7bafd7 100644 --- a/app/controllers/tracks_controller.rb +++ b/app/controllers/tracks_controller.rb @@ -7,12 +7,57 @@ class TracksController < ApplicationController end end + def filterCondition ( filters ) + query = "" + filters.each do | filter | + if param = params[filter] #|| params["#{filter}_id"] + unless query.empty? + query.concat(" and") + end + + case filter + when :tag, :channel, :user + query.concat" #{filter}s.name='#{param}'" + when :date + query.concat(" irc_posts.posted_at='#{param}'") + end + end + end + return query + end + + def filterQuery ( filters ) + query="" + + if [:channel, :user, :date].any? {|param| params.has_key? param} + query.concat(" inner join irc_posts ON irc_posts.track_id = tracks.id") + end + + filters.each do | filter | + if params[filter] || params["#{filter}_id"] + case filter + when :channel + query.concat(" inner join channels on irc_posts.channel_id = channels.id") + when :user + query.concat(" inner join users on irc_posts.user_id = users.id") + when :tag + query.concat(" inner join tag_assignations on tag_assignations.track_id = tracks.id inner join tags on tags.id = tag_assignations.tag_id") + end + end + end + return query + end + + def filtersOptimized( *filters ) + condition = filterCondition( filters ) + query = filterQuery( filters ) + @tracks = Track.joins(query).where(condition).page params[:page] + end + def index - #@tracks = Track.includes(irc_posts: [:channel, :user], tag_assignations: :tag).all #includes(irc_posts: [{ :channels, :users}]) #includes(:channels,:tags,:users) - #t = Track.all.joins('inner join irc_posts i ON tracks.track_id = i.track_id inner join channels c on i.channel_id = c.channel_id inner join gnations ti on tracks.track_id = ti.track_id inner join tags ta on ta.tag_id = ti.tag_id').select('tracks.name as t_name, u.name as u_name, c.name as c_name, ta.name as t_name') - #t.first.c_name - @tracks = Track.includes(:tags).page params[:page] - filters :tag, :channel, :user + #@tracks = Track.includes(:tags).page params[:page] + #filters :tag, :channel, :user + filtersOptimized :tag, :channel, :user, :date render json: @tracks, status: 200, meta: { diff --git a/app/models/track.rb b/app/models/track.rb index 9c1510888c7056f503e893ed0f9c0ac65c1c2fbe..67e2c5008f4bc825cb7a5bd400d84fb9176f8895 100644 --- a/app/models/track.rb +++ b/app/models/track.rb @@ -11,12 +11,10 @@ class Track < ActiveRecord::Base def self.with_tag(tag) self.joins(:tags).where("tags.name = ?", tag ) - #self.includes(:tags) - #self.where("tag = ?", tag) end def self.with_channel(channel) - self.joins(:channels).where("channels.name = ?", "#{channel}") + self.joins(:channels).where("channels.name = ?", channel) end def self.with_user(user)