metamodel 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/metamodel.rb +2 -2
- data/lib/metamodel/command/build.rb +1 -11
- data/lib/metamodel/command/build/renderer.rb +1 -13
- data/lib/metamodel/command/build/translator.rb +11 -9
- data/lib/metamodel/erbal_template.rb +14 -0
- data/lib/metamodel/record/association.rb +29 -8
- data/lib/metamodel/record/model.rb +12 -18
- data/lib/metamodel/record/property.rb +3 -3
- data/lib/metamodel/template/foreign_key.swift +10 -19
- data/lib/metamodel/template/helper.swift +17 -1
- data/lib/metamodel/template/model_delete.swift +2 -2
- data/lib/metamodel/template/model_initialize.swift +22 -6
- data/lib/metamodel/template/model_query.swift +4 -8
- data/lib/metamodel/template/model_update.swift +1 -1
- data/lib/metamodel/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0d8ca3a3bfe2be2fff493e0a8a6ee19f56640df
|
4
|
+
data.tar.gz: 4b704b41431dcc15cf3d7851512de6ec637e973d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c37a823538cc4dc169e80a0aa1dae3839fb275a9e4d668081cbc80e7479b1936c93565249ab8cb572d7d17f35be408c03d5bf2226c9d17791217066dc67eb28b
|
7
|
+
data.tar.gz: e5ee4d3459de834213f65b80817130f7402076f7a86d93edbf22f2f25f51c494b0950c11da6124d9680db05cfa3bc33b8e9a0e3b7c4f6eaa1e1799f2c266781d
|
data/lib/metamodel.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_support/core_ext/string/strip'
|
2
|
-
|
3
1
|
module MetaModel
|
4
2
|
|
5
3
|
class PlainInformative < StandardError; end
|
@@ -14,9 +12,11 @@ module MetaModel
|
|
14
12
|
|
15
13
|
require 'pathname'
|
16
14
|
require 'active_support/inflector'
|
15
|
+
require 'active_support/core_ext/string'
|
17
16
|
|
18
17
|
require 'metamodel/version'
|
19
18
|
require 'metamodel/config'
|
19
|
+
require 'metamodel/erbal_template'
|
20
20
|
|
21
21
|
# Loaded immediately after dependencies to ensure proper override of their
|
22
22
|
# UI methods.
|
@@ -67,7 +67,7 @@ module MetaModel
|
|
67
67
|
#
|
68
68
|
def update_initialize_method
|
69
69
|
template = File.read File.expand_path(File.join(File.dirname(__FILE__), "../template/metamodel.swift"))
|
70
|
-
result =
|
70
|
+
result = Renderer::ErbalTemplate::render_from_hash(template, { :models => @models })
|
71
71
|
model_path = Pathname.new("./metamodel/MetaModel/MetaModel.swift")
|
72
72
|
File.write model_path, result
|
73
73
|
end
|
@@ -120,16 +120,6 @@ module MetaModel
|
|
120
120
|
|
121
121
|
private
|
122
122
|
|
123
|
-
class ErbalT < OpenStruct
|
124
|
-
def self.render_from_hash(t, h)
|
125
|
-
ErbalT.new(h).render(t)
|
126
|
-
end
|
127
|
-
|
128
|
-
def render(template)
|
129
|
-
ERB.new(template).result(binding)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
123
|
CURRENT_SUPPORTED_BUILT_IN_TYPES = %w[
|
134
124
|
Int
|
135
125
|
Double
|
@@ -1,21 +1,9 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'ostruct'
|
3
1
|
require 'xcodeproj'
|
4
2
|
|
5
3
|
module MetaModel
|
6
4
|
class Command
|
7
5
|
class Build
|
8
6
|
class Renderer
|
9
|
-
class ErbalT < OpenStruct
|
10
|
-
def self.render_from_hash(t, h)
|
11
|
-
ErbalT.new(h).render(t)
|
12
|
-
end
|
13
|
-
|
14
|
-
def render(template)
|
15
|
-
ERB.new(template).result(binding)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
7
|
class << self
|
20
8
|
|
21
9
|
def templates
|
@@ -44,7 +32,7 @@ module MetaModel
|
|
44
32
|
file_refs = []
|
45
33
|
models.each do |model|
|
46
34
|
result = templates.map { |template|
|
47
|
-
|
35
|
+
ErbalTemplate::render_from_hash(template, { :model => model })
|
48
36
|
}.join("\n")
|
49
37
|
model_path = Pathname.new("./metamodel/MetaModel/#{model.name}.swift")
|
50
38
|
File.write model_path, result
|
@@ -21,8 +21,10 @@ module MetaModel
|
|
21
21
|
major_model.associations << association
|
22
22
|
association.major_model = major_model
|
23
23
|
association.secondary_model = name_model_hash[association.secondary_model]
|
24
|
+
size = association.through ? 3 : 2
|
25
|
+
association.through = name_model_hash[association.through]
|
24
26
|
raise Informative, "Associations not satisfied in `Metafile`" \
|
25
|
-
unless [association.major_model, association.secondary_model].compact.size ==
|
27
|
+
unless [association.major_model, association.secondary_model, association.through].compact.size == size
|
26
28
|
association
|
27
29
|
end
|
28
30
|
|
@@ -35,21 +37,21 @@ module MetaModel
|
|
35
37
|
end
|
36
38
|
remain
|
37
39
|
end
|
38
|
-
raise Informative, "Unsatisfied constraints in #{satisfy_constraint.map
|
39
|
-
|
40
|
+
raise Informative, "Unsatisfied constraints in #{satisfy_constraint.map \
|
41
|
+
{ |x| x.debug_description }}" \
|
42
|
+
if satisfy_constraint.size > 0
|
40
43
|
|
41
44
|
@associations.each do |association|
|
42
45
|
major_model = association.major_model
|
43
46
|
secondary_model = association.secondary_model
|
44
47
|
case association.relation
|
45
|
-
when :has_one then
|
46
|
-
|
47
|
-
|
48
|
-
when :has_many then
|
49
|
-
property = Record::Property.new(major_model.foreign_id, :int, :foreign, :default => 0)
|
48
|
+
when :has_one, :has_many then
|
49
|
+
name = association.through ? association.through.foreign_id : major_model.foreign_id
|
50
|
+
property = Record::Property.new(name, :int, :foreign, :default => 0)
|
50
51
|
secondary_model.properties << property
|
51
52
|
when :belongs_to then
|
52
|
-
|
53
|
+
name = association.through ? association.through.foreign_id : secondary_model.foreign_id
|
54
|
+
property = Record::Property.new(name, :int, :foreign, :default => 0)
|
53
55
|
major_model.properties << property
|
54
56
|
end
|
55
57
|
end
|
@@ -4,10 +4,10 @@ module MetaModel
|
|
4
4
|
attr_reader :name
|
5
5
|
attr_reader :type
|
6
6
|
attr_reader :relation
|
7
|
-
attr_reader :through
|
8
7
|
attr_reader :dependent
|
9
8
|
attr_accessor :major_model
|
10
9
|
attr_accessor :secondary_model
|
10
|
+
attr_accessor :through
|
11
11
|
|
12
12
|
def initialize(name, major_model, secondary_model, relation, args)
|
13
13
|
through = args[:through]
|
@@ -15,7 +15,7 @@ module MetaModel
|
|
15
15
|
|
16
16
|
@name = name.to_s.camelize :lower
|
17
17
|
@relation = relation
|
18
|
-
@through = through
|
18
|
+
@through = through.to_s.camelize.singularize unless through.nil?
|
19
19
|
@dependent = dependent
|
20
20
|
@major_model = major_model
|
21
21
|
@secondary_model = secondary_model
|
@@ -27,9 +27,18 @@ module MetaModel
|
|
27
27
|
result = true
|
28
28
|
result &= self.major_model == constraint.secondary_model
|
29
29
|
result &= self.secondary_model == constraint.major_model
|
30
|
+
result &= self.through == constraint.through
|
31
|
+
|
30
32
|
result &= case [self.relation, constraint.relation]
|
31
33
|
when [:has_one, :belongs_to], [:belongs_to, :has_one] then true
|
32
|
-
when [:belongs_to, :has_many]
|
34
|
+
when [:belongs_to, :has_many] then
|
35
|
+
return false if self.dependent == :destroy
|
36
|
+
return true unless constraint.through
|
37
|
+
return false
|
38
|
+
when [:has_many, :belongs_to] then
|
39
|
+
return false if constraint.dependent == :destroy
|
40
|
+
return true unless self.through
|
41
|
+
return false
|
33
42
|
when [:has_many, :has_many] then
|
34
43
|
self.through == constraint.through
|
35
44
|
else false
|
@@ -39,8 +48,8 @@ module MetaModel
|
|
39
48
|
|
40
49
|
def secondary_model_instance
|
41
50
|
case relation
|
42
|
-
when :has_many, :has_one then "#{secondary_model.name}.
|
43
|
-
when :belongs_to then "#{secondary_model.name}.
|
51
|
+
when :has_many, :has_one then "#{secondary_model.name}.find(privateId)"
|
52
|
+
when :belongs_to then "#{secondary_model.name}.find(#{secondary_model.foreign_id})"
|
44
53
|
else ""
|
45
54
|
end
|
46
55
|
end
|
@@ -51,6 +60,7 @@ module MetaModel
|
|
51
60
|
|
52
61
|
def validate_association
|
53
62
|
validate_dependent(@dependent)
|
63
|
+
validate_through(@through)
|
54
64
|
end
|
55
65
|
|
56
66
|
def validate_dependent(dependent)
|
@@ -60,6 +70,11 @@ module MetaModel
|
|
60
70
|
unless supported_dependent_options.include? dependent
|
61
71
|
end
|
62
72
|
|
73
|
+
def validate_through(through)
|
74
|
+
raise Informative, "belongs_to can't coexist with through." \
|
75
|
+
if !!through && @relation == :belongs_to
|
76
|
+
end
|
77
|
+
|
63
78
|
|
64
79
|
#-------------------------------------------------------------------------#
|
65
80
|
|
@@ -79,9 +94,15 @@ module MetaModel
|
|
79
94
|
|
80
95
|
def type
|
81
96
|
case @relation
|
82
|
-
when :has_one
|
83
|
-
|
84
|
-
|
97
|
+
when :has_one, :has_many, :belongs_to then secondary_model.name
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def debug_description
|
102
|
+
if through
|
103
|
+
"#{major_model.name}.#{relation}.#{secondary_model.name}.through.#{through.name}.#{dependent}"
|
104
|
+
else
|
105
|
+
"#{major_model.name}.#{relation}.#{secondary_model.name}.#{dependent}"
|
85
106
|
end
|
86
107
|
end
|
87
108
|
end
|
@@ -9,20 +9,26 @@ module MetaModel
|
|
9
9
|
@name = name.to_s.camelize
|
10
10
|
@properties = []
|
11
11
|
@associations = []
|
12
|
-
|
13
|
-
validate
|
14
12
|
end
|
15
13
|
|
16
14
|
def contains?(property)
|
17
15
|
@properties.select { |prop| prop.name == property }.size > 0
|
18
16
|
end
|
19
17
|
|
18
|
+
def all_foreign_properties
|
19
|
+
@properties.select { |element| element.is_foreign? }
|
20
|
+
end
|
21
|
+
|
20
22
|
def properties_exclude_id
|
21
|
-
|
23
|
+
properties_exclude_property "id"
|
24
|
+
end
|
25
|
+
|
26
|
+
def properties_exclude_property(property)
|
27
|
+
@properties.select { |element| element.name != property }
|
22
28
|
end
|
23
29
|
|
24
30
|
def foreign_id
|
25
|
-
"#{name}
|
31
|
+
"#{name}Id".camelize(:lower)
|
26
32
|
end
|
27
33
|
|
28
34
|
def table_name
|
@@ -33,18 +39,6 @@ module MetaModel
|
|
33
39
|
"#{name}Relation"
|
34
40
|
end
|
35
41
|
|
36
|
-
def all_properties
|
37
|
-
all_properties = properties.clone
|
38
|
-
all_properties.push Property.primary_id
|
39
|
-
all_properties
|
40
|
-
end
|
41
|
-
|
42
|
-
def validate
|
43
|
-
property_keys = @properties.map { |property| property.name }
|
44
|
-
|
45
|
-
@properties << Property.new(:id, :int, :unique, :default => 0) unless property_keys.include? "id"
|
46
|
-
end
|
47
|
-
|
48
42
|
def hash_value
|
49
43
|
self.hash.to_s(16)
|
50
44
|
end
|
@@ -85,10 +79,10 @@ module MetaModel
|
|
85
79
|
foreign_sql = @properties.map do |property|
|
86
80
|
next unless property.is_foreign?
|
87
81
|
reference_table_name = property.type.tableize
|
88
|
-
"FOREIGN KEY(#{property.name}) REFERENCES #{reference_table_name}(
|
82
|
+
"FOREIGN KEY(#{property.name}) REFERENCES #{reference_table_name}(privateId)"
|
89
83
|
end
|
90
84
|
|
91
|
-
table + "(
|
85
|
+
table + "(privateId INTEGER PRIMARY KEY, #{(main_sql + foreign_sql).compact.join(", ")});"
|
92
86
|
end
|
93
87
|
|
94
88
|
private
|
@@ -20,8 +20,8 @@ module MetaModel
|
|
20
20
|
|
21
21
|
class << self
|
22
22
|
def primary_id
|
23
|
-
property = Property.new(:
|
24
|
-
property.name = :
|
23
|
+
property = Property.new(:privateId, :int, :primary)
|
24
|
+
property.name = :privateId
|
25
25
|
property
|
26
26
|
end
|
27
27
|
end
|
@@ -74,7 +74,7 @@ module MetaModel
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def is_foreign?
|
77
|
-
@modifiers
|
77
|
+
@modifiers[:foreign]
|
78
78
|
end
|
79
79
|
|
80
80
|
def is_optional?
|
@@ -1,21 +1,11 @@
|
|
1
1
|
// MARK: - Association
|
2
2
|
<% model.associations.each do |association| %><% if association.has_many? %>
|
3
3
|
<%= """public extension #{model.name} {
|
4
|
-
|
5
|
-
var element = element
|
6
|
-
element.update(#{model.foreign_id}: id)
|
7
|
-
}
|
8
|
-
|
9
|
-
func create#{association.type}(#{association.secondary_model.property_key_type_pairs_without_property model.foreign_id}) -> #{association.type}? {
|
10
|
-
return #{association.type}.create(#{association.secondary_model.property_key_value_pairs_without_property model.foreign_id}, #{model.foreign_id}: self.id)
|
11
|
-
}
|
12
|
-
|
13
|
-
func delete#{association.type}(id: Int) {
|
14
|
-
#{association.type}.findBy(#{model.foreign_id}: id).first?.delete
|
15
|
-
}
|
16
|
-
var #{association.name}: [#{association.type}] {
|
4
|
+
var #{association.name}: #{association.secondary_model.relation_name} {
|
17
5
|
get {
|
18
|
-
|
6
|
+
var result = #{association.type}.filter(#{model.foreign_id}: privateId)
|
7
|
+
result.#{model.foreign_id} = privateId
|
8
|
+
return result
|
19
9
|
}
|
20
10
|
set {
|
21
11
|
#{association.name}.forEach { (element) in
|
@@ -24,19 +14,20 @@
|
|
24
14
|
}
|
25
15
|
newValue.forEach { (element) in
|
26
16
|
var element = element
|
27
|
-
element.update(#{model.foreign_id}:
|
17
|
+
element.update(#{model.foreign_id}: privateId)
|
28
18
|
}
|
19
|
+
#{association.name}.#{model.foreign_id} = privateId
|
29
20
|
}
|
30
21
|
}
|
31
22
|
}""" %><% elsif association.belongs_to? %>
|
32
23
|
<%= """public extension #{model.name} {
|
33
24
|
var #{association.name}: #{association.type}? {
|
34
25
|
get {
|
35
|
-
return #{association.secondary_model_instance}
|
26
|
+
return #{association.secondary_model_instance}
|
36
27
|
}
|
37
28
|
set {
|
38
29
|
guard let newValue = newValue else { return }
|
39
|
-
update(#{association.secondary_model.foreign_id}: newValue.
|
30
|
+
update(#{association.secondary_model.foreign_id}: newValue.privateId)
|
40
31
|
}
|
41
32
|
}
|
42
33
|
|
@@ -47,9 +38,9 @@
|
|
47
38
|
return #{association.secondary_model_instance}.first
|
48
39
|
}
|
49
40
|
set {
|
50
|
-
#{association.type}.findBy(#{model.foreign_id}:
|
41
|
+
#{association.type}.findBy(#{model.foreign_id}: privateId).deleteAll
|
51
42
|
guard var newValue = newValue else { return }
|
52
|
-
newValue.update(#{model.foreign_id}:
|
43
|
+
newValue.update(#{model.foreign_id}: privateId)
|
53
44
|
}
|
54
45
|
}
|
55
46
|
}"""%><% end %><% end %>
|
@@ -1,6 +1,8 @@
|
|
1
1
|
// MAKR: - Helper
|
2
2
|
|
3
3
|
public class <%= model.relation_name %>: Relation<<%= model.name %>> {
|
4
|
+
<% model.all_foreign_properties.each do |foreign_property| %><%= """var #{foreign_property.name} = 0
|
5
|
+
"""%><% end %>
|
4
6
|
override init() {
|
5
7
|
super.init()
|
6
8
|
self.select = "SELECT \(<%= model.name %>.tableName.unwrapped).* FROM \(<%= model.name %>.tableName.unwrapped)"
|
@@ -27,9 +29,23 @@ extension <%= model.name %> {
|
|
27
29
|
<% model.properties.each_with_index do |property, index| %><%= """let #{property.name}: #{property.real_type} = values[#{index+1}] as! #{property.real_type}""" %>
|
28
30
|
<% end %>
|
29
31
|
self.init(<%= model.property_key_value_pairs true %>)
|
32
|
+
|
33
|
+
let privateId: Int64 = values[0] as! Int64
|
34
|
+
self.privateId = Int(privateId)
|
30
35
|
}
|
31
36
|
}
|
32
37
|
|
33
38
|
extension <%= model.name %> {
|
34
|
-
var itself: String { get { return "WHERE \(
|
39
|
+
var itself: String { get { return "WHERE \(<%= model.name %>.tableName.unwrapped).\("privateId".unwrapped) = \(privateId)" } }
|
40
|
+
}
|
41
|
+
|
42
|
+
extension <%= model.relation_name %> {
|
43
|
+
func find(privateId: Int) -> Self {
|
44
|
+
return filter(privateId)
|
45
|
+
}
|
46
|
+
|
47
|
+
func filter(privateId: Int) -> Self {
|
48
|
+
self.filter.append("\"privateId\" = \(privateId)")
|
49
|
+
return self
|
50
|
+
}
|
35
51
|
}
|
@@ -5,8 +5,8 @@ public extension <%= model.name %> {
|
|
5
5
|
get {
|
6
6
|
let deleteSQL = "DELETE FROM \(<%= model.name %>.tableName.unwrapped) \(itself)"
|
7
7
|
executeSQL(deleteSQL)<% model.associations.each do |association| %>
|
8
|
-
<%= association.secondary_model_instance + "
|
9
|
-
<%= association.secondary_model_instance + "
|
8
|
+
<%= association.secondary_model_instance + "?.delete" if association.dependent == :destroy %>
|
9
|
+
<%= association.secondary_model_instance + "?.update(#{model.foreign_id}: 0)" if association.dependent == :nullify && model.contains?(model.foreign_id) %>
|
10
10
|
<% end %>
|
11
11
|
return true
|
12
12
|
}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
public struct <%= model.name %> {
|
2
|
+
var privateId: Int = 0
|
2
3
|
<% model.properties.each do |property| %><%= """public var #{property.name}: #{property.type}""" %>
|
3
4
|
<% end %>
|
4
5
|
static let tableName = "<%= model.table_name %>"
|
@@ -6,6 +7,7 @@ public struct <%= model.name %> {
|
|
6
7
|
public enum Column: String, Unwrapped {
|
7
8
|
<% model.properties.each do |property| %><%= """case #{property.name} = \"#{property.name}\"""" %>
|
8
9
|
<% end %>
|
10
|
+
case privateId = "privateId"
|
9
11
|
var unwrapped: String { get { return self.rawValue.unwrapped } }
|
10
12
|
}
|
11
13
|
|
@@ -19,14 +21,12 @@ public struct <%= model.name %> {
|
|
19
21
|
}
|
20
22
|
|
21
23
|
static public func create(<%= model.property_key_type_pairs %>) -> <%= model.name %>? {
|
22
|
-
if <%= model.properties.select { |p| p.name.downcase.end_with? "id" }.map { |p| "#{p.name} == 0" }.join(" || ") %> { return nil }
|
24
|
+
//if <%= model.properties.select { |p| p.name.downcase.end_with? "id" }.map { |p| "#{p.name} == 0" }.push("false == true").join(" || ") %> { return nil }
|
23
25
|
|
24
26
|
var columnsSQL: [<%= model.name %>.Column] = []
|
25
27
|
var valuesSQL: [Unwrapped] = []
|
26
28
|
|
27
|
-
|
28
|
-
valuesSQL.append(id)
|
29
|
-
<% model.properties_exclude_id.each do |property| %><% if property.is_optional? %>
|
29
|
+
<% model.properties.each do |property| %><% if property.is_optional? %>
|
30
30
|
<%= """if let #{property.name} = #{property.name} {
|
31
31
|
columnsSQL.append(.#{property.name})
|
32
32
|
valuesSQL.append(#{property.name})
|
@@ -35,7 +35,23 @@ public struct <%= model.name %> {
|
|
35
35
|
valuesSQL.append(#{property.name})
|
36
36
|
""" %><% end %><% end %>
|
37
37
|
let insertSQL = "INSERT INTO \(tableName.unwrapped) (\(columnsSQL.map { $0.rawValue }.joinWithSeparator(", "))) VALUES (\(valuesSQL.map { $0.unwrapped }.joinWithSeparator(", ")))"
|
38
|
-
guard let _ = executeSQL(insertSQL)
|
39
|
-
|
38
|
+
guard let _ = executeSQL(insertSQL),
|
39
|
+
let lastInsertRowId = executeScalarSQL("SELECT last_insert_rowid();") as? Int64 else { return nil }
|
40
|
+
var result = <%= model.name %>(<%= model.property_key_value_pairs %>)
|
41
|
+
result.privateId = Int(lastInsertRowId)
|
42
|
+
return result
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
public extension <%= model.relation_name %> {
|
47
|
+
<% model.all_foreign_properties.each do |property| %>
|
48
|
+
func create(<%= model.property_key_type_pairs_without_property property.name %>) -> <%= model.name %>? {
|
49
|
+
return <%= model.name %>.create(<% if model.properties_exclude_property(property).count == 0 %><%= "#{property}: property" %><% else %><%= model.property_key_value_pairs %><% end %>)
|
40
50
|
}
|
51
|
+
|
52
|
+
func append(element: <%= model.name %>) {
|
53
|
+
var element = element
|
54
|
+
element.<%= property.name %> = <%= property.name %>
|
55
|
+
}
|
56
|
+
<% end %>
|
41
57
|
}
|
@@ -7,22 +7,22 @@ public extension <%= model.name %> {
|
|
7
7
|
|
8
8
|
static var first: <%= model.name %>? {
|
9
9
|
get {
|
10
|
-
return <%= model.relation_name %>().orderBy(.
|
10
|
+
return <%= model.relation_name %>().orderBy(.privateId, asc: true).first
|
11
11
|
}
|
12
12
|
}
|
13
13
|
|
14
14
|
static var last: <%= model.name %>? {
|
15
15
|
get {
|
16
|
-
return <%= model.relation_name %>().orderBy(.
|
16
|
+
return <%= model.relation_name %>().orderBy(.privateId, asc: false).first
|
17
17
|
}
|
18
18
|
}
|
19
19
|
|
20
20
|
static func first(length: UInt) -> <%= model.relation_name %> {
|
21
|
-
return <%= model.relation_name %>().orderBy(.
|
21
|
+
return <%= model.relation_name %>().orderBy(.privateId, asc: true).limit(length)
|
22
22
|
}
|
23
23
|
|
24
24
|
static func last(length: UInt) -> <%= model.relation_name %> {
|
25
|
-
return <%= model.relation_name %>().orderBy(.
|
25
|
+
return <%= model.relation_name %>().orderBy(.privateId, asc: false).limit(length)
|
26
26
|
}
|
27
27
|
|
28
28
|
static func find(id: Int) -> <%= model.name %>? {
|
@@ -69,10 +69,6 @@ public extension <%= model.name %> {
|
|
69
69
|
}
|
70
70
|
|
71
71
|
public extension <%= model.relation_name %> {
|
72
|
-
func find(id: Int) -> Self {
|
73
|
-
return findBy(id: id)
|
74
|
-
}
|
75
|
-
|
76
72
|
func findBy(<%= model.property_key_type_pairs(true, true) %>) -> Self {
|
77
73
|
var attributes: [<%= model.name %>.Column: Any] = [:]
|
78
74
|
<% model.properties.each do |property| %><%= "if (#{property.name} != #{property.type_without_optional}DefaultValue) { attributes[.#{property.name}] = #{property.name} }" %>
|
@@ -31,7 +31,7 @@ public extension <%= model.name %> {
|
|
31
31
|
|
32
32
|
var save: <%= model.name %> {
|
33
33
|
mutating get {
|
34
|
-
if let _ = <%= model.name %>.find(
|
34
|
+
if let _ = <%= model.name %>.find(privateId) {
|
35
35
|
update([<% column_values = model.properties.map do |property| %><% ".#{property.name}: #{property.name}" %><% end %><%= column_values.join(", ") %>])
|
36
36
|
} else {
|
37
37
|
<%= model.name %>.create(<%= model.property_key_value_pairs %>)
|
data/lib/metamodel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metamodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Draveness Zuo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: claide
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- lib/metamodel/command/generate.rb
|
156
156
|
- lib/metamodel/command/init.rb
|
157
157
|
- lib/metamodel/config.rb
|
158
|
+
- lib/metamodel/erbal_template.rb
|
158
159
|
- lib/metamodel/record/association.rb
|
159
160
|
- lib/metamodel/record/model.rb
|
160
161
|
- lib/metamodel/record/property.rb
|