metamodel 0.1.8 → 0.1.9
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.
- 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
|