sql_values 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +32 -0
- data/Rakefile +14 -0
- data/init.rb +2 -0
- data/lib/sql_values.rb +32 -0
- data/lib/sql_values/railtie.rb +23 -0
- data/lib/sql_values/version.rb +3 -0
- data/rails/init.rb +2 -0
- data/sql_values.gemspec +23 -0
- data/test/helper.rb +12 -0
- data/test/test_sql_values.rb +57 -0
- metadata +82 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
*sql_values* retrieves SQL values using Active Record query interface but without instantiation of AR-objects.
|
2
|
+
|
3
|
+
Assuming you've got a class:
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
class Player < ActiveRecord::Base
|
7
|
+
validates_presence_of :name
|
8
|
+
scope :best, order('rating desc')
|
9
|
+
end
|
10
|
+
```
|
11
|
+
|
12
|
+
You can now retrieve `values`:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
Player.values(:name) # => ["boffy", "pitibo", "macovsky"]
|
16
|
+
Player.best.values(:rating) # => [30, 25, 10]
|
17
|
+
```
|
18
|
+
|
19
|
+
There's also a shorthand `ids` for `values(:id)`:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
Player.where("rating>?", 10).ids # => [1, 3]
|
23
|
+
Player.ids(:league_id) # => [5, 3, 4]
|
24
|
+
```
|
25
|
+
|
26
|
+
And last but not the least, `hashes`:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Player.hashes(%w{id name}) # => [{"id" => 1, "name" => "boffy"}, {"id" => 2, "name" => "pitibo"}, {"id" => 3, "name" => "macovsky"}]
|
30
|
+
```
|
31
|
+
|
32
|
+
That's all folks!
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
# Run the test with 'rake' or 'rake test'
|
6
|
+
desc 'Default: run acts_as_list unit tests.'
|
7
|
+
task :default => :test
|
8
|
+
|
9
|
+
desc 'Test the acts_as_list plugin.'
|
10
|
+
Rake::TestTask.new(:test) do |t|
|
11
|
+
t.libs << 'lib' << 'test'
|
12
|
+
t.pattern = 'test/**/test_*.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
data/init.rb
ADDED
data/lib/sql_values.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "sql_values/version"
|
2
|
+
require "sql_values/railtie"
|
3
|
+
|
4
|
+
module SqlValues
|
5
|
+
module RelationInstanceMethods
|
6
|
+
def values(name)
|
7
|
+
connection.select_values(select(name).to_sql)
|
8
|
+
end
|
9
|
+
|
10
|
+
def ids(name = :id)
|
11
|
+
values(name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def hashes(names)
|
15
|
+
connection.select_all(select(names).to_sql)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ActiveRecordClassMethods
|
20
|
+
def values(name)
|
21
|
+
relation.values(name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def ids(name = :id)
|
25
|
+
relation.ids(name)
|
26
|
+
end
|
27
|
+
|
28
|
+
def hashes(names)
|
29
|
+
relation.hashes(names)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'sql_values'
|
2
|
+
|
3
|
+
module SqlValues
|
4
|
+
if defined?(Rails::Railtie)
|
5
|
+
require 'rails'
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
initializer 'sql_values.insert_into_active_record' do
|
8
|
+
ActiveSupport.on_load :active_record do
|
9
|
+
SqlValues::Railtie.insert
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Railtie
|
16
|
+
def self.insert
|
17
|
+
if defined?(ActiveRecord)
|
18
|
+
ActiveRecord::Relation.send(:include, SqlValues::RelationInstanceMethods)
|
19
|
+
ActiveRecord::Base.extend(SqlValues::ActiveRecordClassMethods)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/rails/init.rb
ADDED
data/sql_values.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "sql_values/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "sql_values"
|
7
|
+
s.version = SqlValues::VERSION
|
8
|
+
s.authors = ["Max Savchenko"]
|
9
|
+
s.email = ["robotector@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/macovsky/sql_values"
|
11
|
+
s.summary = %q{Retrieve SQL values using Active Record query interface but without instantiation of AR-objects}
|
12
|
+
s.description = %q{}
|
13
|
+
|
14
|
+
s.rubyforge_project = "sql_values"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency 'activerecord', '>= 3.0.0'
|
22
|
+
s.add_development_dependency 'sqlite3'
|
23
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'active_record'
|
12
|
+
require "#{File.dirname(__FILE__)}/../init"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
4
|
+
|
5
|
+
class Player < ActiveRecord::Base
|
6
|
+
scope :best, order('rating desc')
|
7
|
+
end
|
8
|
+
|
9
|
+
class PlayerTest < Test::Unit::TestCase
|
10
|
+
DATA = [
|
11
|
+
{'rating' => 2, 'name' => 'boffy'},
|
12
|
+
{'rating' => 3, 'name' => 'pitibo'},
|
13
|
+
{'rating' => 1, 'name' => 'macovsky'},
|
14
|
+
]
|
15
|
+
|
16
|
+
BEST_DATA = DATA.sort_by{|data| data['rating']}.reverse
|
17
|
+
|
18
|
+
def setup
|
19
|
+
ActiveRecord::Schema.define(:version => 1) do
|
20
|
+
create_table :players do |t|
|
21
|
+
t.column :rating, :integer, :null => false, :default => 0
|
22
|
+
t.column :name, :string
|
23
|
+
end
|
24
|
+
end
|
25
|
+
Player.create(DATA)
|
26
|
+
end
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
30
|
+
ActiveRecord::Base.connection.drop_table(table)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_respond_to
|
35
|
+
%w{ids values hashes}.each do |name|
|
36
|
+
assert Player.respond_to?(name)
|
37
|
+
assert Player.best.respond_to?(name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_values
|
42
|
+
assert_equal Player.ids, [1,2,3]
|
43
|
+
assert_equal Player.values(:id), [1,2,3]
|
44
|
+
assert_equal Player.values(:name), DATA.map{|d| d['name']}
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_values_on_relation
|
48
|
+
assert_equal Player.best.ids, [2,1,3]
|
49
|
+
assert_equal Player.best.values(:id), [2,1,3]
|
50
|
+
assert_equal Player.best.values(:name), BEST_DATA.map{|d| d['name']}
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_hashes
|
54
|
+
assert_equal Player.hashes(%w{rating name}), DATA
|
55
|
+
assert_equal Player.best.hashes(%w{rating name}), BEST_DATA
|
56
|
+
end
|
57
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sql_values
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Max Savchenko
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-12 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &70192875659360 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70192875659360
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: sqlite3
|
27
|
+
requirement: &70192875658620 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70192875658620
|
36
|
+
description: ''
|
37
|
+
email:
|
38
|
+
- robotector@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- README.md
|
46
|
+
- Rakefile
|
47
|
+
- init.rb
|
48
|
+
- lib/sql_values.rb
|
49
|
+
- lib/sql_values/railtie.rb
|
50
|
+
- lib/sql_values/version.rb
|
51
|
+
- rails/init.rb
|
52
|
+
- sql_values.gemspec
|
53
|
+
- test/helper.rb
|
54
|
+
- test/test_sql_values.rb
|
55
|
+
homepage: http://github.com/macovsky/sql_values
|
56
|
+
licenses: []
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
requirements: []
|
74
|
+
rubyforge_project: sql_values
|
75
|
+
rubygems_version: 1.8.10
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: Retrieve SQL values using Active Record query interface but without instantiation
|
79
|
+
of AR-objects
|
80
|
+
test_files:
|
81
|
+
- test/helper.rb
|
82
|
+
- test/test_sql_values.rb
|