Module: AssociationCount
- Defined in:
- lib/association_count.rb,
lib/association_count/version.rb
Defined Under Namespace
Classes: Configuration
Constant Summary collapse
- VERSION =
"1.1.0"
Class Method Summary collapse
Instance Method Summary collapse
- #association_count(counted_model, distinct: AssociationCount.config.distinct, join_type: AssociationCount.config.join_type) ⇒ Object
- #can_count(model_name, opts = {}) ⇒ Object
- #define_association_count_method(model_name, singular_name) ⇒ Object
- #define_count_scope(singular_name, reflection, default_distinct, default_join_type) ⇒ Object
Class Method Details
.config ⇒ Object
55 56 57 |
# File 'lib/association_count.rb', line 55 def self.config configuration end |
.configuration ⇒ Object
51 52 53 |
# File 'lib/association_count.rb', line 51 def self.configuration @configuration ||= Configuration.new end |
.configure {|configuration| ... } ⇒ Object
59 60 61 62 |
# File 'lib/association_count.rb', line 59 def self.configure yield(configuration) if block_given? configuration end |
Instance Method Details
#association_count(counted_model, distinct: AssociationCount.config.distinct, join_type: AssociationCount.config.join_type) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# File 'lib/association_count.rb', line 4 def association_count( counted_model, distinct: AssociationCount.config.distinct, join_type: AssociationCount.config.join_type ) table_name = self.table_name counted_table = counted_model.table_name counted_name = counted_table.singularize distinct_sql = distinct ? 'DISTINCT' : '' public_send(join_type, counted_table.to_sym) .select("#{table_name}.*, COUNT(#{distinct_sql} #{counted_table}.id) as #{counted_name}_count_raw") .group("#{table_name}.id") end |
#can_count(model_name, opts = {}) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/association_count.rb', line 19 def can_count(model_name, opts = {}) model_name = model_name.to_s reflection = reflections[model_name] raise ArgumentError, "No such reflection: '#{model_name}'" unless reflection = { distinct: AssociationCount.config.distinct, join_type: AssociationCount.config.join_type }.merge!(opts) singular_name = model_name.singularize define_association_count_method(model_name, singular_name) define_count_scope(singular_name, reflection, [:distinct], [:join_type]) end |
#define_association_count_method(model_name, singular_name) ⇒ Object
34 35 36 37 38 39 40 |
# File 'lib/association_count.rb', line 34 def define_association_count_method(model_name, singular_name) define_method "#{singular_name}_count" do raw_count_name = "#{singular_name}_count_raw" return send(raw_count_name) if self.respond_to?(raw_count_name) send(model_name).count end end |
#define_count_scope(singular_name, reflection, default_distinct, default_join_type) ⇒ Object
42 43 44 45 46 47 48 49 |
# File 'lib/association_count.rb', line 42 def define_count_scope(singular_name, reflection, default_distinct, default_join_type) scope_name = "include_#{singular_name}_count" class_eval do scope scope_name, ->(distinct: default_distinct, join_type: default_join_type) { association_count(reflection.klass, distinct: distinct, join_type: join_type) } end end |