sequel_model 0.4.2 → 0.5
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/CHANGELOG +26 -0
- data/README +3 -3
- data/Rakefile +4 -4
- data/lib/sequel_model.rb +17 -16
- data/lib/sequel_model/associations.rb +317 -0
- data/lib/sequel_model/record.rb +2 -2
- data/spec/associations_spec.rb +616 -0
- data/spec/deprecated_relations_spec.rb +153 -0
- data/spec/spec_helper.rb +4 -0
- metadata +8 -7
- data/lib/sequel_model/relations.rb +0 -154
- data/spec/relations_spec.rb +0 -149
@@ -0,0 +1,153 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "spec_helper")
|
2
|
+
|
3
|
+
describe Sequel::Model, "one_to_one" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
MODEL_DB.reset
|
7
|
+
|
8
|
+
@c1 = Class.new(Sequel::Model(:attributes)) do
|
9
|
+
end
|
10
|
+
|
11
|
+
@c2 = Class.new(Sequel::Model(:nodes)) do
|
12
|
+
def columns; [:id, :parent_id]; end
|
13
|
+
end
|
14
|
+
|
15
|
+
@dataset = @c2.dataset
|
16
|
+
|
17
|
+
@dataset.extend(Module.new {
|
18
|
+
def fetch_rows(sql)
|
19
|
+
@db << sql
|
20
|
+
yield({:hey => 1})
|
21
|
+
end
|
22
|
+
})
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should use implicit key if omitted" do
|
26
|
+
@c2.one_to_one :parent, :from => @c2
|
27
|
+
|
28
|
+
d = @c2.new(:id => 1, :parent_id => 234)
|
29
|
+
p = d.parent
|
30
|
+
p.class.should == @c2
|
31
|
+
p.values.should == {:hey => 1}
|
32
|
+
|
33
|
+
MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should use explicit key if given" do
|
37
|
+
@c2.one_to_one :parent, :from => @c2, :key => :blah
|
38
|
+
|
39
|
+
d = @c2.new(:id => 1, :blah => 567)
|
40
|
+
p = d.parent
|
41
|
+
p.class.should == @c2
|
42
|
+
p.values.should == {:hey => 1}
|
43
|
+
|
44
|
+
MODEL_DB.sqls.should == ["SELECT * FROM nodes WHERE (id = 567) LIMIT 1"]
|
45
|
+
end
|
46
|
+
|
47
|
+
# the new implementation doesn't support plain datasets as associations
|
48
|
+
# it "should support plain dataset in the from option" do
|
49
|
+
# @c2.one_to_one :parent, :from => MODEL_DB[:xyz]
|
50
|
+
#
|
51
|
+
# d = @c2.new(:id => 1, :parent_id => 789)
|
52
|
+
# p = d.parent
|
53
|
+
# p.class.should == Hash
|
54
|
+
#
|
55
|
+
# MODEL_DB.sqls.should == ["SELECT * FROM xyz WHERE (id = 789) LIMIT 1"]
|
56
|
+
# end
|
57
|
+
|
58
|
+
# the new implementation doesn't support plain datasets as associations
|
59
|
+
# it "should support table name in the from option" do
|
60
|
+
# @c2.one_to_one :parent, :from => :abc
|
61
|
+
#
|
62
|
+
# d = @c2.new(:id => 1, :parent_id => 789)
|
63
|
+
# p = d.parent
|
64
|
+
# p.class.should == Hash
|
65
|
+
#
|
66
|
+
# MODEL_DB.sqls.should == ["SELECT * FROM abc WHERE (id = 789) LIMIT 1"]
|
67
|
+
# end
|
68
|
+
|
69
|
+
it "should return nil if key value is nil" do
|
70
|
+
@c2.one_to_one :parent, :from => @c2
|
71
|
+
|
72
|
+
d = @c2.new(:id => 1)
|
73
|
+
d.parent.should == nil
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should define a setter method" do
|
77
|
+
@c2.one_to_one :parent, :from => @c2
|
78
|
+
|
79
|
+
d = @c2.load(:id => 1)
|
80
|
+
d.parent = @c2.new(:id => 4321)
|
81
|
+
d.values.should == {:id => 1, :parent_id => 4321}
|
82
|
+
d.save_changes
|
83
|
+
MODEL_DB.sqls.last.should == "UPDATE nodes SET parent_id = 4321 WHERE (id = 1)"
|
84
|
+
|
85
|
+
d.parent = nil
|
86
|
+
d.values.should == {:id => 1, :parent_id => nil}
|
87
|
+
d.save_changes
|
88
|
+
MODEL_DB.sqls.last.should == "UPDATE nodes SET parent_id = NULL WHERE (id = 1)"
|
89
|
+
|
90
|
+
e = @c2.new(:id => 6677)
|
91
|
+
d.parent = e
|
92
|
+
d.values.should == {:id => 1, :parent_id => 6677}
|
93
|
+
d.save_changes
|
94
|
+
MODEL_DB.sqls.last.should == "UPDATE nodes SET parent_id = 6677 WHERE (id = 1)"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe Sequel::Model, "one_to_many" do
|
99
|
+
|
100
|
+
before(:each) do
|
101
|
+
MODEL_DB.reset
|
102
|
+
|
103
|
+
@c1 = Class.new(Sequel::Model(:attributes)) do
|
104
|
+
end
|
105
|
+
|
106
|
+
@c2 = Class.new(Sequel::Model(:nodes)) do
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should define a getter method" do
|
111
|
+
@c2.one_to_many :attributes, :from => @c1, :key => :node_id
|
112
|
+
|
113
|
+
n = @c2.new(:id => 1234)
|
114
|
+
a = n.attributes
|
115
|
+
a.should be_a_kind_of(Sequel::Dataset)
|
116
|
+
a.sql.should == 'SELECT * FROM attributes WHERE (node_id = 1234)'
|
117
|
+
end
|
118
|
+
|
119
|
+
# the new implementation doesn't support plain datasets as associations
|
120
|
+
# it "should support plain dataset in the from option" do
|
121
|
+
# @c2.one_to_many :attributes, :from => MODEL_DB[:xyz], :key => :node_id
|
122
|
+
#
|
123
|
+
# n = @c2.new(:id => 1234)
|
124
|
+
# a = n.attributes
|
125
|
+
# a.should be_a_kind_of(Sequel::Dataset)
|
126
|
+
# a.sql.should == 'SELECT * FROM xyz WHERE (node_id = 1234)'
|
127
|
+
# end
|
128
|
+
|
129
|
+
# the new implementation doesn't support plain datasets as associations
|
130
|
+
# it "should support table name in the from option" do
|
131
|
+
# @c2.one_to_many :attributes, :from => :abc, :key => :node_id
|
132
|
+
#
|
133
|
+
# n = @c2.new(:id => 1234)
|
134
|
+
# a = n.attributes
|
135
|
+
# a.should be_a_kind_of(Sequel::Dataset)
|
136
|
+
# a.sql.should == 'SELECT * FROM abc WHERE (node_id = 1234)'
|
137
|
+
# end
|
138
|
+
|
139
|
+
it "should support implicit key names" do
|
140
|
+
$c1 = @c1
|
141
|
+
|
142
|
+
module Music
|
143
|
+
class BlueNote < Sequel::Model
|
144
|
+
one_to_many :attributes, :from => $c1
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
n = Music::BlueNote.new(:id => 1234)
|
149
|
+
a = n.attributes
|
150
|
+
a.should be_a_kind_of(Sequel::Dataset)
|
151
|
+
a.sql.should == 'SELECT * FROM attributes WHERE (blue_note_id = 1234)'
|
152
|
+
end
|
153
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.5"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-03-08 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
- !ruby/object:Gem::Version
|
31
31
|
version: "1.0"
|
32
32
|
version:
|
33
|
-
description:
|
33
|
+
description: Model classes for Sequel
|
34
34
|
email: ciconia@gmail.com
|
35
35
|
executables: []
|
36
36
|
|
@@ -44,26 +44,27 @@ files:
|
|
44
44
|
- COPYING
|
45
45
|
- README
|
46
46
|
- Rakefile
|
47
|
+
- spec/associations_spec.rb
|
47
48
|
- spec/base_spec.rb
|
48
49
|
- spec/caching_spec.rb
|
50
|
+
- spec/deprecated_relations_spec.rb
|
49
51
|
- spec/hooks_spec.rb
|
50
52
|
- spec/model_spec.rb
|
51
53
|
- spec/plugins_spec.rb
|
52
54
|
- spec/rcov.opts
|
53
55
|
- spec/record_spec.rb
|
54
|
-
- spec/relations_spec.rb
|
55
56
|
- spec/schema_spec.rb
|
56
57
|
- spec/spec.opts
|
57
58
|
- spec/spec_helper.rb
|
58
59
|
- spec/validations_spec.rb
|
59
60
|
- lib/sequel_model
|
61
|
+
- lib/sequel_model/associations.rb
|
60
62
|
- lib/sequel_model/base.rb
|
61
63
|
- lib/sequel_model/caching.rb
|
62
64
|
- lib/sequel_model/hooks.rb
|
63
65
|
- lib/sequel_model/plugins.rb
|
64
66
|
- lib/sequel_model/pretty_table.rb
|
65
67
|
- lib/sequel_model/record.rb
|
66
|
-
- lib/sequel_model/relations.rb
|
67
68
|
- lib/sequel_model/schema.rb
|
68
69
|
- lib/sequel_model/validations.rb
|
69
70
|
- lib/sequel_model.rb
|
@@ -74,7 +75,7 @@ post_install_message:
|
|
74
75
|
rdoc_options:
|
75
76
|
- --quiet
|
76
77
|
- --title
|
77
|
-
- "Sequel
|
78
|
+
- "Sequel: The Database Toolkit for Ruby"
|
78
79
|
- --opname
|
79
80
|
- index.html
|
80
81
|
- --line-numbers
|
@@ -105,6 +106,6 @@ rubyforge_project: sequel
|
|
105
106
|
rubygems_version: 1.0.1
|
106
107
|
signing_key:
|
107
108
|
specification_version: 2
|
108
|
-
summary:
|
109
|
+
summary: Model classes for Sequel
|
109
110
|
test_files: []
|
110
111
|
|
@@ -1,154 +0,0 @@
|
|
1
|
-
module Sequel
|
2
|
-
class Model
|
3
|
-
ID_POSTFIX = '_id'.freeze
|
4
|
-
|
5
|
-
# Creates a 1-1 relationship by defining an association method, e.g.:
|
6
|
-
#
|
7
|
-
# class Session < Sequel::Model
|
8
|
-
# end
|
9
|
-
#
|
10
|
-
# class Node < Sequel::Model
|
11
|
-
# one_to_one :producer, :from => Session
|
12
|
-
# # which is equivalent to
|
13
|
-
# def producer
|
14
|
-
# Session[producer_id] if producer_id
|
15
|
-
# end
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# You can also set the foreign key explicitly by including a :key option:
|
19
|
-
#
|
20
|
-
# one_to_one :producer, :from => Session, :key => :producer_id
|
21
|
-
#
|
22
|
-
# The one_to_one macro also creates a setter, which accepts nil, a hash or
|
23
|
-
# a model instance, e.g.:
|
24
|
-
#
|
25
|
-
# p = Producer[1234]
|
26
|
-
# node = Node[:path => '/']
|
27
|
-
# node.producer = p
|
28
|
-
# node.producer_id #=> 1234
|
29
|
-
#
|
30
|
-
def self.one_to_one(name, opts)
|
31
|
-
from = opts[:from]
|
32
|
-
from || (raise Error, "No association source defined (use :from option)")
|
33
|
-
key = opts[:key] || (name.to_s + ID_POSTFIX).to_sym
|
34
|
-
|
35
|
-
setter_name = "#{name}=".to_sym
|
36
|
-
|
37
|
-
case from
|
38
|
-
when Symbol
|
39
|
-
class_def(name) {(k = @values[key]) ? db[from][:id => k] : nil}
|
40
|
-
when Sequel::Dataset
|
41
|
-
class_def(name) {(k = @values[key]) ? from[:id => k] : nil}
|
42
|
-
else
|
43
|
-
class_def(name) {(k = @values[key]) ? from[k] : nil}
|
44
|
-
end
|
45
|
-
class_def(setter_name) do |v|
|
46
|
-
case v
|
47
|
-
when nil
|
48
|
-
set(key => nil)
|
49
|
-
when Sequel::Model
|
50
|
-
set(key => v.pk)
|
51
|
-
when Hash
|
52
|
-
set(key => v[:id])
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# define_method name, &eval(ONE_TO_ONE_PROC % [key, from])
|
57
|
-
end
|
58
|
-
|
59
|
-
# Creates a 1-N relationship by defining an association method, e.g.:
|
60
|
-
#
|
61
|
-
# class Book < Sequel::Model
|
62
|
-
# end
|
63
|
-
#
|
64
|
-
# class Author < Sequel::Model
|
65
|
-
# one_to_many :books, :from => Book
|
66
|
-
# # which is equivalent to
|
67
|
-
# def books
|
68
|
-
# Book.filter(:author_id => id)
|
69
|
-
# end
|
70
|
-
# end
|
71
|
-
#
|
72
|
-
# You can also set the foreign key explicitly by including a :key option:
|
73
|
-
#
|
74
|
-
# one_to_many :books, :from => Book, :key => :author_id
|
75
|
-
#
|
76
|
-
def self.one_to_many(name, opts)
|
77
|
-
from = opts[:from]
|
78
|
-
from || (raise Error, "No association source defined (use :from option)")
|
79
|
-
key = opts[:key] || (self.name.demodulize.underscore.to_s + ID_POSTFIX).to_sym
|
80
|
-
|
81
|
-
case from
|
82
|
-
when Symbol
|
83
|
-
class_def(name) {db[from].filter(key => pk)}
|
84
|
-
else
|
85
|
-
class_def(name) {from.filter(key => pk)}
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# TODO: Add/Replace current relations with the following specifications:
|
90
|
-
# ======================================================================
|
91
|
-
|
92
|
-
# Database modelling is generally done with an ER (Entity Relationship) diagram.
|
93
|
-
# Shouldn't ORM's facilitate simlilar specification?
|
94
|
-
|
95
|
-
# class Post < Sequel::Model
|
96
|
-
# relationships do
|
97
|
-
# # Specify the relationships that exist with the User model (users table)
|
98
|
-
# # These relationships are precisely the ER diagram connecting arrows.
|
99
|
-
# end
|
100
|
-
# end
|
101
|
-
|
102
|
-
#
|
103
|
-
# = Relationships
|
104
|
-
#
|
105
|
-
# are specifications of the ends of the ER diagrams connectors that are touching
|
106
|
-
# the current model.
|
107
|
-
#
|
108
|
-
# one_to_one, has_one
|
109
|
-
# many_to_one, belongs_to
|
110
|
-
# many_to_many, has_many
|
111
|
-
# ?parameters may be :zero, :one, :many which specifies the cardinality of the connection
|
112
|
-
|
113
|
-
# Example:
|
114
|
-
# class Post < Sequel::Model
|
115
|
-
# relationships do
|
116
|
-
# has :one, :blog, :required => true # blog_id field, cannot be null
|
117
|
-
# has :one, :account # account_id field
|
118
|
-
# has :many, :comments # comments_posts join table
|
119
|
-
# has :many, :authors, :required => true # authors_posts join table, requires at least one author
|
120
|
-
# end
|
121
|
-
# end
|
122
|
-
|
123
|
-
#
|
124
|
-
# Relationship API Details
|
125
|
-
#
|
126
|
-
|
127
|
-
#
|
128
|
-
# == belongs_to
|
129
|
-
#
|
130
|
-
|
131
|
-
# Defines an blog and blog= method
|
132
|
-
# belongs_to :blog
|
133
|
-
|
134
|
-
# Same, but uses "b_id" as the blog's id field.
|
135
|
-
# belongs_to :blog, :key => :b_id
|
136
|
-
|
137
|
-
# has_many :comments
|
138
|
-
# * Defines comments method which will query the join table appropriately.
|
139
|
-
# * Checks to see if a "comments_posts" join table exists (alphabetical order)
|
140
|
-
# ** If it does not exist, will create the join table.
|
141
|
-
# ** If options are passed in these will be used to further define the join table.
|
142
|
-
|
143
|
-
|
144
|
-
# Benefits:
|
145
|
-
# * Normalized DB
|
146
|
-
# * Easy to define join objects
|
147
|
-
# * Efficient queries, database gets to use indexed fields (pkeys) instead of a string field and an id.
|
148
|
-
#
|
149
|
-
# For example, polymorphic associations now become:
|
150
|
-
# [user] 1-* [addresses_users] *-1 [addresses]
|
151
|
-
# [companies] 1-* [addresses_companies] *-1 [addresses]
|
152
|
-
# [clients] 1-* [addresses_clients] *-1 [addresses]
|
153
|
-
end
|
154
|
-
end
|
data/spec/relations_spec.rb
DELETED
@@ -1,149 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "spec_helper")
|
2
|
-
|
3
|
-
describe Sequel::Model, "one_to_one" do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
MODEL_DB.reset
|
7
|
-
|
8
|
-
@c1 = Class.new(Sequel::Model(:attributes)) do
|
9
|
-
end
|
10
|
-
|
11
|
-
@c2 = Class.new(Sequel::Model(:nodes)) do
|
12
|
-
end
|
13
|
-
|
14
|
-
@dataset = @c2.dataset
|
15
|
-
|
16
|
-
$sqls = []
|
17
|
-
@dataset.extend(Module.new {
|
18
|
-
def fetch_rows(sql)
|
19
|
-
$sqls << sql
|
20
|
-
yield({:hey => 1})
|
21
|
-
end
|
22
|
-
|
23
|
-
def update(values)
|
24
|
-
$sqls << update_sql(values)
|
25
|
-
end
|
26
|
-
}
|
27
|
-
)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should use implicit key if omitted" do
|
31
|
-
@c2.one_to_one :parent, :from => @c2
|
32
|
-
|
33
|
-
d = @c2.new(:id => 1, :parent_id => 234)
|
34
|
-
p = d.parent
|
35
|
-
p.class.should == @c2
|
36
|
-
p.values.should == {:hey => 1}
|
37
|
-
|
38
|
-
$sqls.should == ["SELECT * FROM nodes WHERE (id = 234) LIMIT 1"]
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should use explicit key if given" do
|
42
|
-
@c2.one_to_one :parent, :from => @c2, :key => :blah
|
43
|
-
|
44
|
-
d = @c2.new(:id => 1, :blah => 567)
|
45
|
-
p = d.parent
|
46
|
-
p.class.should == @c2
|
47
|
-
p.values.should == {:hey => 1}
|
48
|
-
|
49
|
-
$sqls.should == ["SELECT * FROM nodes WHERE (id = 567) LIMIT 1"]
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should support plain dataset in the from option" do
|
53
|
-
@c2.one_to_one :parent, :from => MODEL_DB[:xyz]
|
54
|
-
|
55
|
-
d = @c2.new(:id => 1, :parent_id => 789)
|
56
|
-
p = d.parent
|
57
|
-
p.class.should == Hash
|
58
|
-
|
59
|
-
MODEL_DB.sqls.should == ["SELECT * FROM xyz WHERE (id = 789) LIMIT 1"]
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should support table name in the from option" do
|
63
|
-
@c2.one_to_one :parent, :from => :abc
|
64
|
-
|
65
|
-
d = @c2.new(:id => 1, :parent_id => 789)
|
66
|
-
p = d.parent
|
67
|
-
p.class.should == Hash
|
68
|
-
|
69
|
-
MODEL_DB.sqls.should == ["SELECT * FROM abc WHERE (id = 789) LIMIT 1"]
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should return nil if key value is nil" do
|
73
|
-
@c2.one_to_one :parent, :from => @c2
|
74
|
-
|
75
|
-
d = @c2.new(:id => 1)
|
76
|
-
d.parent.should == nil
|
77
|
-
end
|
78
|
-
|
79
|
-
it "should define a setter method" do
|
80
|
-
@c2.one_to_one :parent, :from => @c2
|
81
|
-
|
82
|
-
d = @c2.new(:id => 1)
|
83
|
-
d.parent = {:id => 4321}
|
84
|
-
d.values.should == {:id => 1, :parent_id => 4321}
|
85
|
-
$sqls.last.should == "UPDATE nodes SET parent_id = 4321 WHERE (id = 1)"
|
86
|
-
|
87
|
-
d.parent = nil
|
88
|
-
d.values.should == {:id => 1, :parent_id => nil}
|
89
|
-
$sqls.last.should == "UPDATE nodes SET parent_id = NULL WHERE (id = 1)"
|
90
|
-
|
91
|
-
e = @c2.new(:id => 6677)
|
92
|
-
d.parent = e
|
93
|
-
d.values.should == {:id => 1, :parent_id => 6677}
|
94
|
-
$sqls.last.should == "UPDATE nodes SET parent_id = 6677 WHERE (id = 1)"
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
describe Sequel::Model, "one_to_many" do
|
99
|
-
|
100
|
-
before(:each) do
|
101
|
-
MODEL_DB.reset
|
102
|
-
|
103
|
-
@c1 = Class.new(Sequel::Model(:attributes)) do
|
104
|
-
end
|
105
|
-
|
106
|
-
@c2 = Class.new(Sequel::Model(:nodes)) do
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should define a getter method" do
|
111
|
-
@c2.one_to_many :attributes, :from => @c1, :key => :node_id
|
112
|
-
|
113
|
-
n = @c2.new(:id => 1234)
|
114
|
-
a = n.attributes
|
115
|
-
a.should be_a_kind_of(Sequel::Dataset)
|
116
|
-
a.sql.should == 'SELECT * FROM attributes WHERE (node_id = 1234)'
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should support plain dataset in the from option" do
|
120
|
-
@c2.one_to_many :attributes, :from => MODEL_DB[:xyz], :key => :node_id
|
121
|
-
|
122
|
-
n = @c2.new(:id => 1234)
|
123
|
-
a = n.attributes
|
124
|
-
a.should be_a_kind_of(Sequel::Dataset)
|
125
|
-
a.sql.should == 'SELECT * FROM xyz WHERE (node_id = 1234)'
|
126
|
-
end
|
127
|
-
|
128
|
-
it "should support table name in the from option" do
|
129
|
-
@c2.one_to_many :attributes, :from => :abc, :key => :node_id
|
130
|
-
|
131
|
-
n = @c2.new(:id => 1234)
|
132
|
-
a = n.attributes
|
133
|
-
a.should be_a_kind_of(Sequel::Dataset)
|
134
|
-
a.sql.should == 'SELECT * FROM abc WHERE (node_id = 1234)'
|
135
|
-
end
|
136
|
-
|
137
|
-
it "should support implicit key names" do
|
138
|
-
module Music
|
139
|
-
class BlueNote < Sequel::Model
|
140
|
-
one_to_many :attributes, :from => :abc
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
n = Music::BlueNote.new(:id => 1234)
|
145
|
-
a = n.attributes
|
146
|
-
a.should be_a_kind_of(Sequel::Dataset)
|
147
|
-
a.sql.should == 'SELECT * FROM abc WHERE (blue_note_id = 1234)'
|
148
|
-
end
|
149
|
-
end
|