gem 'pg_tag', git: 'git://gist.github.com/895e8e58ba83f72efd2a.git', require: 'pg_tag'
has_pg_tag **** # your col name
class Array | |
# Give %w[a b] | |
# Return "'{a, b}'" | |
# | |
def to_pg_array_string | |
"'{#{join(', ')}}'" | |
end | |
# Give %w[a b] | |
# Return "ARRAY['a', 'b']" | |
# | |
def to_pg_array_text | |
"ARRAY#{to_s}" | |
end | |
alias_method :to_pg_array_integer, :to_pg_array_text | |
end |
Gem::Specification.new do |s| | |
s.name = 'pg_tag' | |
s.version = '0.0.1' | |
s.platform = Gem::Platform::RUBY | |
s.author = 'Raykin' | |
s.email = '[email protected]' | |
s.summary = 'Easy query and update pg array column in rails' | |
s.description = 'Same as Summary' | |
s.files = ['pg_tag.rb'] | |
s.require_path = '.' | |
end |
require 'array' | |
require 'active_support/concern' | |
module PgTag | |
def self.build_pg_string | |
Proc.new do |ele, col_type| | |
case ele | |
when String, Numeric | |
matchs = [ele] | |
when Array | |
matchs = ele | |
else | |
matchs = ele.to_a | |
end | |
matchs.send "to_pg_array_#{col_type}" | |
end | |
end | |
extend ActiveSupport::Concern | |
module ClassMethods | |
def has_pg_tag(*names, col_type: :string) | |
names.each do |name| | |
define_singleton_method "#{name}_contain" do |match_value| | |
pg_array = PgTag.build_pg_string.call(match_value, col_type) | |
where("#{name} @> #{pg_array}") | |
end | |
define_singleton_method "#{name}_overlap" do |match_value| | |
pg_array = PgTag.build_pg_string.call(match_value, col_type) | |
where("#{name} && #{pg_array}") | |
end | |
define_method "add_#{name}" do |value| | |
new_value = send(name).clone.push(value) | |
send("#{name}=", new_value) | |
end | |
end | |
end # END has_pg_tag | |
end | |
end | |
ActiveRecord::Base.send :include, PgTag |
require 'minitest/autorun' | |
require 'active_record/railtie' | |
require 'pg_tag' | |
class PgTagTest < Minitest::Test | |
def setup | |
@str = "abc" | |
@array = %w[1 2 3] | |
end | |
def test_str_to_pg_array | |
assert_equal "'{abc}'", PgTag.build_pg_string.call(@str, 'string') | |
end | |
def test_array_to_pg_array | |
assert_equal("ARRAY[\"1\", \"2\", \"3\"]", | |
PgTag.build_pg_string.call(@array, 'text')) | |
end | |
end |