Sha256: 8d827ce454b0a5fd032314f858fa69c1b8e54596407278331ba0368a8f22594e
Contents?: true
Size: 1.62 KB
Versions: 1
Compression:
Stored size: 1.62 KB
Contents
# frozen_string_literal: true module ActsAsTaggableArrayOn module Taggable def self.included(base) base.extend(ClassMethod) end TYPE_MATCHER = { string: 'varchar', text: 'text' } module ClassMethod def acts_as_taggable_array_on(*tag_def) tag_name = tag_def.first tag_array_type = TYPE_MATCHER[columns_hash[tag_name.to_s].type] parser = ActsAsTaggableArrayOn.parser scope :"with_any_#{tag_name}", ->(tags){ where("#{tag_name} && ARRAY[?]::#{tag_array_type}[]", parser.parse(tags)) } scope :"with_all_#{tag_name}", ->(tags){ where("#{tag_name} @> ARRAY[?]::#{tag_array_type}[]", parser.parse(tags)) } scope :"without_any_#{tag_name}", ->(tags){ where.not("#{tag_name} && ARRAY[?]::#{tag_array_type}[]", parser.parse(tags)) } scope :"without_all_#{tag_name}", ->(tags){ where.not("#{tag_name} @> ARRAY[?]::#{tag_array_type}[]", parser.parse(tags)) } self.class.class_eval do define_method :"all_#{tag_name}" do |options = {}, &block| subquery_scope = unscoped.select("unnest(#{table_name}.#{tag_name}) as tag").distinct subquery_scope = subquery_scope.instance_eval(&block) if block from(subquery_scope).pluck('tag') end define_method :"#{tag_name}_cloud" do |options = {}, &block| subquery_scope = unscoped.select("unnest(#{table_name}.#{tag_name}) as tag") subquery_scope = subquery_scope.instance_eval(&block) if block from(subquery_scope).group('tag').order('tag').pluck('tag, count(*) as count') end end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
acts-as-taggable-array-on-0.4.1 | lib/acts-as-taggable-array-on/taggable.rb |