diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb index 62bcdaaac..4bbbe3873 100644 --- a/app/controllers/concerns/commentable_actions.rb +++ b/app/controllers/concerns/commentable_actions.rb @@ -8,13 +8,19 @@ module CommentableActions @resources = @advanced_search_terms.present? ? @resources.filter(@advanced_search_terms) : @resources @resources = @resources.tagged_with(@tag_filter) if @tag_filter - @resources = @resources.page(params[:page]).for_render.send("sort_by_#{@current_order}") + @resources = if @current_order == "recommended" && current_user.present? + @resources.recommended(current_user).page(params[:page]).send("sort_by_#{@current_order}") + else + @resources.page(params[:page]).for_render.send("sort_by_#{@current_order}") + end + index_customization if index_customization.present? @tag_cloud = tag_cloud @banners = Banner.with_active set_resource_votes(@resources) + set_resources_instance end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index b8d6bdf10..cd113d486 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -10,7 +10,7 @@ class DebatesController < ApplicationController invisible_captcha only: [:create, :update], honeypot: :subtitle - has_orders %w{hot_score confidence_score created_at relevance}, only: :index + has_orders ->(c) { Debate.debates_orders(c.current_user) }, only: :index has_orders %w{most_voted newest oldest}, only: :show load_and_authorize_resource diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index 8b75a10cf..c06438076 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -9,7 +9,7 @@ class ProposalsController < ApplicationController invisible_captcha only: [:create, :update], honeypot: :subtitle - has_orders %w{hot_score confidence_score created_at relevance archival_date}, only: :index + has_orders ->(c) { Proposal.proposals_orders(c.current_user) }, only: :index has_orders %w{most_voted newest oldest}, only: :show load_and_authorize_resource diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 5aec4a456..da66c061a 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,5 +1,6 @@ class WelcomeController < ApplicationController skip_authorization_check + before_action :set_user_recommendations, only: :index, if: :current_user layout "devise", only: [:welcome, :verification] @@ -13,4 +14,11 @@ class WelcomeController < ApplicationController redirect_to verification_path if signed_in? end + private + + def set_user_recommendations + @recommended_debates = Debate.recommended(current_user).limit(3) + @recommended_proposals = Proposal.recommended(current_user).limit(3) + end + end diff --git a/app/models/debate.rb b/app/models/debate.rb index 9d74597b8..bf5253b88 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -37,14 +37,27 @@ class Debate < ActiveRecord::Base scope :sort_by_random, -> { reorder("RANDOM()") } scope :sort_by_relevance, -> { all } scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } + scope :sort_by_recommended, -> { order(cached_votes_total: :desc) } scope :last_week, -> { where("created_at >= ?", 7.days.ago)} scope :featured, -> { where("featured_at is not null")} scope :public_for_api, -> { all } + # Ahoy setup visitable # Ahoy will automatically assign visit_id on create attr_accessor :link_required + def self.recommended(user) + debates_list = where("author_id != ?", user.id) + #same as "with_tagged(user.interests, any: true)" + debates_list_with_tagged = debates_list.joins(:tags).where('taggings.taggable_type = ?', self.name).where('tags.name IN (?)', user.interests) + if debates_list_with_tagged.any? + debates_list = debates_list_with_tagged + end + + debates_list + end + def searchable_values { title => 'A', author.username => 'B', @@ -135,4 +148,9 @@ class Debate < ActiveRecord::Base featured_at.present? end + def self.debates_orders(user) + orders = %w{hot_score confidence_score created_at relevance} + orders << "recommended" if user.present? + orders + end end diff --git a/app/models/proposal.rb b/app/models/proposal.rb index 21335c5a5..1e42f673d 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -48,6 +48,7 @@ class Proposal < ActiveRecord::Base scope :sort_by_relevance, -> { all } scope :sort_by_flags, -> { order(flags_count: :desc, updated_at: :desc) } scope :sort_by_archival_date, -> { archived.sort_by_confidence_score } + scope :sort_by_recommended, -> { order(cached_votes_up: :desc) } scope :archived, -> { where("proposals.created_at <= ?", Setting["months_to_archive_proposals"].to_i.months.ago) } scope :not_archived, -> { where("proposals.created_at > ?", Setting["months_to_archive_proposals"].to_i.months.ago) } scope :last_week, -> { where("proposals.created_at >= ?", 7.days.ago)} @@ -56,6 +57,18 @@ class Proposal < ActiveRecord::Base scope :successful, -> { where("cached_votes_up >= ?", Proposal.votes_needed_for_success) } scope :public_for_api, -> { all } + def self.recommended(user) + proposals_list = where("author_id != ?", user.id) + proposals_list_with_tagged = proposals_list.joins(:tags).where('taggings.taggable_type = ?', self.name) + .where('tags.name IN (?)', user.interests) + if proposals_list_with_tagged.any? + followed_proposals_ids = Proposal.followed_by_user(user).pluck(:id) + proposals_list = proposals_list_with_tagged.where("proposals.id NOT IN (?)", followed_proposals_ids) + end + + proposals_list + end + def to_param "#{id}-#{title}".parameterize end @@ -175,6 +188,12 @@ class Proposal < ActiveRecord::Base (voters + followers).uniq end + def self.proposals_orders(user) + orders = %w{hot_score confidence_score created_at relevance archival_date} + orders << "recommended" if user.present? + orders + end + protected def set_responsible_name diff --git a/app/models/user.rb b/app/models/user.rb index 1f5749d96..60536195b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -313,29 +313,6 @@ class User < ActiveRecord::Base follows.map{|follow| follow.followable.tags.map(&:name)}.flatten.compact.uniq end - def recommended_debates - debates_list = Debate.where("author_id != ?", self) - debates_list_with_tagged = debates_list.tagged_with(interests, any: true) - - if interests.any? && debates_list_with_tagged.any? - debates_list = debates_list_with_tagged - end - - debates_list.order("cached_votes_total DESC").limit(3) - end - - def recommended_proposals - proposals_list = Proposal.where("author_id != ?", id) - proposals_list_with_tagged = proposals_list.tagged_with(interests, any: true) - - if interests.any? && proposals_list_with_tagged.any? - followed_proposals_ids = Proposal.followed_by_user(self).pluck(:id) - proposals_list = proposals_list_with_tagged.where("id NOT IN (?)", followed_proposals_ids) - end - - proposals_list.order("cached_votes_up DESC").limit(3) - end - private def clean_document_number diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index b6356ffb2..cb21b4f36 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -53,7 +53,7 @@