ft: where option to includes conditions on rating
This commit is contained in:
		
							parent
							
								
									5b5b638cf7
								
							
						
					
					
						commit
						e84b9b13a5
					
				@ -29,7 +29,10 @@ module Rating
 | 
				
			|||||||
            (CAST(#{total_count} AS DECIMAL(17, 14)) / #{distinct_count}) count_avg,
 | 
					            (CAST(#{total_count} AS DECIMAL(17, 14)) / #{distinct_count}) count_avg,
 | 
				
			||||||
            COALESCE(AVG(value), 0)                                       rating_avg
 | 
					            COALESCE(AVG(value), 0)                                       rating_avg
 | 
				
			||||||
          FROM #{rate_table_name}
 | 
					          FROM #{rate_table_name}
 | 
				
			||||||
          WHERE resource_type = :resource_type #{scope_type_query(resource, scopeable)}
 | 
					          WHERE
 | 
				
			||||||
 | 
					            resource_type = :resource_type
 | 
				
			||||||
 | 
					            #{scope_type_query(resource, scopeable)}
 | 
				
			||||||
 | 
					            #{scope_where_query(resource)}
 | 
				
			||||||
        ).squish
 | 
					        ).squish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        execute_sql [sql, values]
 | 
					        execute_sql [sql, values]
 | 
				
			||||||
@ -54,7 +57,11 @@ module Rating
 | 
				
			|||||||
            COALESCE(SUM(value), 0) rating_sum,
 | 
					            COALESCE(SUM(value), 0) rating_sum,
 | 
				
			||||||
            COUNT(1)                rating_count
 | 
					            COUNT(1)                rating_count
 | 
				
			||||||
          FROM #{rate_table_name}
 | 
					          FROM #{rate_table_name}
 | 
				
			||||||
          WHERE resource_type = ? AND resource_id = ? #{scope_type_and_id_query(resource, scopeable)}
 | 
					          WHERE
 | 
				
			||||||
 | 
					            resource_type = ?
 | 
				
			||||||
 | 
					            AND resource_id = ?
 | 
				
			||||||
 | 
					            #{scope_type_and_id_query(resource, scopeable)}
 | 
				
			||||||
 | 
					            #{scope_where_query(resource)}
 | 
				
			||||||
        ).squish
 | 
					        ).squish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        values =  [sql, resource.class.base_class.name, resource.id]
 | 
					        values =  [sql, resource.class.base_class.name, resource.id]
 | 
				
			||||||
@ -104,7 +111,10 @@ module Rating
 | 
				
			|||||||
        %((
 | 
					        %((
 | 
				
			||||||
          SELECT GREATEST(#{count}, 1)
 | 
					          SELECT GREATEST(#{count}, 1)
 | 
				
			||||||
          FROM #{rate_table_name}
 | 
					          FROM #{rate_table_name}
 | 
				
			||||||
          WHERE resource_type = :resource_type #{scope_type_query(resource, scopeable)}
 | 
					          WHERE
 | 
				
			||||||
 | 
					            resource_type = :resource_type
 | 
				
			||||||
 | 
					            #{scope_type_query(resource, scopeable)}
 | 
				
			||||||
 | 
					            #{scope_where_query(resource)}
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -124,6 +134,16 @@ module Rating
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        'AND scopeable_type = ? AND scopeable_id = ?'
 | 
					        'AND scopeable_type = ? AND scopeable_id = ?'
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def scope_where_query(resource)
 | 
				
			||||||
 | 
					        return '' if where_condition(resource).blank?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        "AND #{where_condition(resource)}"
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def where_condition(resource)
 | 
				
			||||||
 | 
					        resource.rating_options[:where]
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								spec/factories/toy.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								spec/factories/toy.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FactoryBot.define do
 | 
				
			||||||
 | 
					  factory :toy do
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										33
									
								
								spec/models/extension/where_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								spec/models/extension/where_spec.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RSpec.describe Rating::Extension, 'unscoped_rating' do
 | 
				
			||||||
 | 
					  let!(:author_1) { create :author }
 | 
				
			||||||
 | 
					  let!(:author_2) { create :author }
 | 
				
			||||||
 | 
					  let!(:author_3) { create :author }
 | 
				
			||||||
 | 
					  let!(:author_4) { create :author }
 | 
				
			||||||
 | 
					  let!(:author_5) { create :author }
 | 
				
			||||||
 | 
					  let!(:resource) { create :toy }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it 'uses rate with where condition' do
 | 
				
			||||||
 | 
					    author_1.rate resource, 1
 | 
				
			||||||
 | 
					    author_2.rate resource, 2
 | 
				
			||||||
 | 
					    author_3.rate resource, 3
 | 
				
			||||||
 | 
					    author_4.rate resource, 4
 | 
				
			||||||
 | 
					    author_5.rate resource, 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ratings = Rating::Rating.all.order('id')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(ratings.size).to eq 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rating = ratings[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(rating.average.to_s).to  eq '3.0'
 | 
				
			||||||
 | 
					    expect(rating.estimate.to_s).to eq '3.0'
 | 
				
			||||||
 | 
					    expect(rating.resource).to      eq resource
 | 
				
			||||||
 | 
					    expect(rating.scopeable).to     eq nil
 | 
				
			||||||
 | 
					    expect(rating.sum).to           eq 9
 | 
				
			||||||
 | 
					    expect(rating.total).to         eq 3
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										8
									
								
								spec/support/db/migrate/create_toys_table.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								spec/support/db/migrate/create_toys_table.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CreateToysTable < ActiveRecord::Migration[5.0]
 | 
				
			||||||
 | 
					  def change
 | 
				
			||||||
 | 
					    create_table :toys do |t|
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -7,6 +7,7 @@ CreateRatingTable.new.change
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CreateArticlesTable.new.change
 | 
					CreateArticlesTable.new.change
 | 
				
			||||||
CreateAuthorsTable.new.change
 | 
					CreateAuthorsTable.new.change
 | 
				
			||||||
 | 
					CreateToysTable.new.change
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CreateGlobalsTable.new.change
 | 
					CreateGlobalsTable.new.change
 | 
				
			||||||
CreateCategoriesTable.new.change
 | 
					CreateCategoriesTable.new.change
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								spec/support/models/toy.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								spec/support/models/toy.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Toy < ::ActiveRecord::Base
 | 
				
			||||||
 | 
					  rating where: 'value > 1 and value < 5'
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user