get_or_build 0.0.1
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 +43 -0
- data/Rakefile +1 -0
- data/get_or_build.gemspec +26 -0
- data/lib/get_or_build/version.rb +3 -0
- data/lib/get_or_build.rb +21 -0
- data/test/active_record_test.rb +30 -0
- data/test/models/company.rb +4 -0
- data/test/models/location.rb +1 -0
- data/test/models/user.rb +3 -0
- data/test/test_helper.rb +22 -0
- metadata +102 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# GetOrBuild
|
2
|
+
|
3
|
+
This is a association builder which helps to generate or get associated object with `belogs_to` or `has_one` association.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your Gemfile
|
8
|
+
`gem 'get_or_build'`
|
9
|
+
then as usually update installed gem by typing `bundle` in terminal.
|
10
|
+
|
11
|
+
## Using with ActiveRecord
|
12
|
+
|
13
|
+
Assume you have model `Company` which has one `User` and belongs to `Location`:
|
14
|
+
|
15
|
+
class Company < ActiveRecord::Base
|
16
|
+
belongs_to :location
|
17
|
+
has_one :user
|
18
|
+
accepts_nested_attributes_for :user
|
19
|
+
accepts_nested_attrbiutes_for :location
|
20
|
+
end
|
21
|
+
|
22
|
+
class User < ActiveRecord::Base; end
|
23
|
+
class Location < ActiveRecord::Base; end
|
24
|
+
|
25
|
+
When you are building form for company with nested attributes for location or user you are able now use new methods like `user_or_build` or `location_or_build`:
|
26
|
+
|
27
|
+
form_for :company do |f|
|
28
|
+
f.fields_for :user, f.object.user_or_build do |fu|
|
29
|
+
fu.text_field :name
|
30
|
+
f.fields_for :location, f.object.location_or_build do |fl|
|
31
|
+
fl.text_field :address
|
32
|
+
|
33
|
+
No longer need to call `f.object.user || f.object.build_user`
|
34
|
+
|
35
|
+
## Using with NoSQL databases
|
36
|
+
|
37
|
+
Just include in your document module `GetOrBuild::AssociationBuilder` and it will attach magick methods automatically
|
38
|
+
|
39
|
+
## Contributing
|
40
|
+
You are welcome! Please, run test before pull request: `ruby test/*.rb` and make sure if everything is workig correctly.
|
41
|
+
|
42
|
+
## TODO
|
43
|
+
* tests for `MongoMapper`
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "get_or_build/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "get_or_build"
|
7
|
+
s.version = FieldsForBuilder::VERSION
|
8
|
+
s.authors = ["Andrey Koleshko"]
|
9
|
+
s.email = ["ka8725@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Provides method which allows get or build belongs_to or has_one association}
|
12
|
+
s.description = %q{Assume user belongs_to company and you want to get company object within one method call. You can do it like this: user.company_or_build}
|
13
|
+
|
14
|
+
s.rubyforge_project = "get_or_build"
|
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
|
+
# specify any dependencies here; for example:
|
22
|
+
s.add_development_dependency "activerecord"
|
23
|
+
s.add_development_dependency "sqlite3"
|
24
|
+
s.add_development_dependency "rake"
|
25
|
+
# s.add_runtime_dependency "rest-client"
|
26
|
+
end
|
data/lib/get_or_build.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "get_or_build/version"
|
2
|
+
|
3
|
+
module GetOrBuild
|
4
|
+
module AssociationBuilder
|
5
|
+
# f.object.location_or_build
|
6
|
+
def method_missing(method, *args)
|
7
|
+
if method =~ /(\w+)_or_build$/
|
8
|
+
if result = send($1, *args)
|
9
|
+
result
|
10
|
+
else
|
11
|
+
builder_method = "build_#{$1}"
|
12
|
+
send(builder_method, *args) if respond_to?(builder_method)
|
13
|
+
end
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
ActiveRecord::Base.send :include, GetOrBuild::AssociationBuilder if defined?(ActiveRecord)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class ActiveRecordTest < TestHelper
|
4
|
+
def test_with_new_record
|
5
|
+
c = Company.new
|
6
|
+
assert_not_nil c.location_or_build
|
7
|
+
assert_not_nil c.user_or_build
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_new_record_with_params
|
11
|
+
c = Company.new
|
12
|
+
assert_not_nil c.location_or_build(:address => 'Address'), 'Address'
|
13
|
+
assert_not_nil c.user_or_build(:name => 'User'), 'User'
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_with_persisted_record
|
17
|
+
user = User.new(:name => 'Mister Duncan')
|
18
|
+
location = Location.new(:address => 'Beverly Hills')
|
19
|
+
c = Company.new(:user => user, :location => location)
|
20
|
+
assert_equal c.user_or_build.name, user.name
|
21
|
+
assert_equal c.location_or_build.address, location.address
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_method_missing
|
25
|
+
c = Company.new
|
26
|
+
assert_raise NoMethodError do
|
27
|
+
c.my_method
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
class Location < ActiveRecord::Base; end
|
data/test/models/user.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'active_record'
|
3
|
+
require 'get_or_build'
|
4
|
+
Dir[File.expand_path('../models/*.rb', __FILE__)].each {|f| require f}
|
5
|
+
|
6
|
+
class TestHelper < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3",
|
9
|
+
:database => ":memory:")
|
10
|
+
ActiveRecord::Base.connection.create_table(:companies) do |t|
|
11
|
+
t.integer :location_id
|
12
|
+
t.string :name
|
13
|
+
end
|
14
|
+
ActiveRecord::Base.connection.create_table(:users) do |t|
|
15
|
+
t.integer :company_id
|
16
|
+
t.string :name
|
17
|
+
end
|
18
|
+
ActiveRecord::Base.connection.create_table(:locations) do |t|
|
19
|
+
t.string :address
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: get_or_build
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrey Koleshko
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-22 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &70280247996960 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70280247996960
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: sqlite3
|
27
|
+
requirement: &70280247996520 !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: *70280247996520
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
requirement: &70280247996100 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70280247996100
|
47
|
+
description: ! 'Assume user belongs_to company and you want to get company object
|
48
|
+
within one method call. You can do it like this: user.company_or_build'
|
49
|
+
email:
|
50
|
+
- ka8725@gmail.com
|
51
|
+
executables: []
|
52
|
+
extensions: []
|
53
|
+
extra_rdoc_files: []
|
54
|
+
files:
|
55
|
+
- .gitignore
|
56
|
+
- Gemfile
|
57
|
+
- README.md
|
58
|
+
- Rakefile
|
59
|
+
- get_or_build.gemspec
|
60
|
+
- lib/get_or_build.rb
|
61
|
+
- lib/get_or_build/version.rb
|
62
|
+
- test/active_record_test.rb
|
63
|
+
- test/models/company.rb
|
64
|
+
- test/models/location.rb
|
65
|
+
- test/models/user.rb
|
66
|
+
- test/test_helper.rb
|
67
|
+
homepage: ''
|
68
|
+
licenses: []
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
hash: -3989985633040186247
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
hash: -3989985633040186247
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project: get_or_build
|
93
|
+
rubygems_version: 1.8.10
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: Provides method which allows get or build belongs_to or has_one association
|
97
|
+
test_files:
|
98
|
+
- test/active_record_test.rb
|
99
|
+
- test/models/company.rb
|
100
|
+
- test/models/location.rb
|
101
|
+
- test/models/user.rb
|
102
|
+
- test/test_helper.rb
|