web-connect 0.4.0 → 0.4.2
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/netfira/web_connect/db_schema/20140515_alpha.rb +1 -2
- data/lib/netfira/web_connect/migration.rb +4 -0
- data/lib/netfira/web_connect/model/record/tree.rb +12 -2
- data/lib/netfira/web_connect/model/record.rb +3 -0
- data/lib/netfira/web_connect/model/relation.rb +62 -0
- data/lib/netfira/web_connect/models/support/shop.rb +10 -0
- data/lib/netfira/web_connect/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 435761d473e6207771accd7586c0c8b6003e7073
|
4
|
+
data.tar.gz: a17604aba5f073120cc6c3d5abe496f92e14a4b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: faa5af85ed89bebf95e56a031d1c15d59a44fb8becba703058e2c559cc85fa637799a62f14f369bbab378521c4e7f9c524c7506b9b56e34eed1547a75b96009c
|
7
|
+
data.tar.gz: de81cfb5722537b64e7e704b86f937e85904a4f7a37be182af4560307c309c5855cb30be65c0ca4bf7a5e932eff9a2cec883153685960ad90e01d4d9b6dd6349
|
@@ -44,8 +44,7 @@ class Alpha < Netfira::WebConnect::Migration
|
|
44
44
|
t.boolean :show_on_website
|
45
45
|
end
|
46
46
|
|
47
|
-
create_record_table :categories, with_l10n: true do |t|
|
48
|
-
t.integer :parent_id
|
47
|
+
create_record_table :categories, with_l10n: true, tree: true do |t|
|
49
48
|
t.localized_string :name
|
50
49
|
end
|
51
50
|
|
@@ -23,6 +23,10 @@ module Netfira::WebConnect
|
|
23
23
|
t.string options[:origin_key] || :"#{table_name.to_s.singularize}_id", index: true unless options[:writable]
|
24
24
|
yield t
|
25
25
|
t.references :shop, index: true
|
26
|
+
if options[:tree]
|
27
|
+
t.string :parent_id
|
28
|
+
t.index [:shop_id, :parent_id]
|
29
|
+
end
|
26
30
|
if options[:sendable]
|
27
31
|
t.binary :guid, index: true
|
28
32
|
t.integer :delivery_status, default: 0, limit: 3, index: true
|
@@ -2,11 +2,21 @@ module Netfira::WebConnect
|
|
2
2
|
module Model::Record::Tree
|
3
3
|
|
4
4
|
def children
|
5
|
-
self.class.where(parent_id:
|
5
|
+
(origin_id.nil? || origin_id.empty?) ? [] : self.class.where(shop_id: shop_id, parent_id: origin_id)
|
6
6
|
end
|
7
7
|
|
8
8
|
def parent
|
9
|
-
@parent ||= parent_id && self.class.find_by(
|
9
|
+
@parent ||= parent_id && !parent_id.empty? && self.class.find_by(shop_id: shop_id, origin_key => parent_id)
|
10
|
+
end
|
11
|
+
|
12
|
+
def parent_id=(value)
|
13
|
+
if Fixnum === value
|
14
|
+
@parent = self.class.find(value)
|
15
|
+
value = @parent.origin_id
|
16
|
+
elsif value != parent_id
|
17
|
+
@parent = nil
|
18
|
+
end
|
19
|
+
self[:parent_id] = value
|
10
20
|
end
|
11
21
|
|
12
22
|
end
|
@@ -109,6 +109,9 @@ module Netfira::WebConnect
|
|
109
109
|
schema = self.class.schema
|
110
110
|
if schema.localize.include? key
|
111
111
|
set_translated_string key, value
|
112
|
+
elsif key == :parent_id
|
113
|
+
value = value.to_s
|
114
|
+
write_attribute key, value.empty? ? nil : value
|
112
115
|
else
|
113
116
|
type = schema.columns[key]
|
114
117
|
return false unless type
|
@@ -9,14 +9,70 @@ module Netfira::WebConnect
|
|
9
9
|
attr_reader :related_classes
|
10
10
|
|
11
11
|
def materialize(name_a, name_b)
|
12
|
+
|
13
|
+
# The new class, e.g. Models::CategoryToProduct
|
12
14
|
klass = Class.new(self)
|
13
15
|
Models.const_set "#{name_a}To#{name_b}", klass
|
16
|
+
|
17
|
+
# An array of related classes, e.g. [Models::Category, Models::Product]
|
14
18
|
klass.related_classes = [name_a, name_b].map{ |n| Models.const_get n.camelize.singularize }
|
19
|
+
|
20
|
+
# Sets up paranoia, including a with_deleted scope for consistency
|
15
21
|
if Netfira::WebConnect.paranoia?
|
16
22
|
klass.acts_as_paranoid
|
17
23
|
else
|
18
24
|
def klass.with_deleted; self end
|
19
25
|
end
|
26
|
+
|
27
|
+
# Enables finding by origin IDs, e.g.:
|
28
|
+
# CategoryToProduct.find_by_origin_ids(category: 'fruit', product: 'apple', shop: 5)
|
29
|
+
find_by_origin_ids = proc do |**args|
|
30
|
+
|
31
|
+
# The table of the current class, e.g. nf_categories_to_products
|
32
|
+
join_table = klass.arel_table
|
33
|
+
|
34
|
+
# The scope we're building
|
35
|
+
scope = klass
|
36
|
+
|
37
|
+
# Include a shop in the scope if one is given
|
38
|
+
shop = args[:shop]
|
39
|
+
if shop
|
40
|
+
shop = shop.id if Models::Shop === shop
|
41
|
+
raise "`shop` must be an integer or an instance of #{Models::Shop.name}" unless Fixnum === shop
|
42
|
+
end
|
43
|
+
|
44
|
+
# Join each class and add where clauses
|
45
|
+
klass.related_classes.each do |related_class|
|
46
|
+
|
47
|
+
# The related table, e.g. nf_products
|
48
|
+
related_table = related_class.arel_table
|
49
|
+
|
50
|
+
# The argument expected to identify the relevant row of the table, e.g. :product
|
51
|
+
origin_id_arg = related_class.single_name.to_sym
|
52
|
+
|
53
|
+
# The origin ID to find in the table, e.g. 'apple'
|
54
|
+
origin_id = args[origin_id_arg] or raise "Missing argument `#{origin_id_arg}`"
|
55
|
+
|
56
|
+
# The column in which to seek the origin ID, e.g. :product_id
|
57
|
+
origin_key = related_class.origin_key.to_sym
|
58
|
+
|
59
|
+
# Join the related table, e.g.:
|
60
|
+
# INNER JOIN "nf_products" ON "nf_categories_to_products"."product_id" = "nf_products"."id"
|
61
|
+
scope = scope.joins join_table.join(related_table).on(join_table[origin_key].eq related_table[:id]).join_sql
|
62
|
+
|
63
|
+
# Look for the origin ID, e.g.:
|
64
|
+
# WHERE "nf_products"."product_id" = 'apple'
|
65
|
+
scope = scope.where related_table[origin_key].eq origin_id
|
66
|
+
|
67
|
+
# Limit to the given shop, e.g.:
|
68
|
+
# AND "nf_products"."shop_id" = 5
|
69
|
+
scope = scope.where related_table[:shop_id].eq shop if shop
|
70
|
+
end
|
71
|
+
|
72
|
+
# Only look for one record.
|
73
|
+
scope.limit 1
|
74
|
+
end
|
75
|
+
klass.scope :find_by_origin_ids, find_by_origin_ids
|
20
76
|
end
|
21
77
|
|
22
78
|
def related_classes=(classes)
|
@@ -65,6 +121,12 @@ module Netfira::WebConnect
|
|
65
121
|
Models.const_get name if Models.const_defined? name
|
66
122
|
end
|
67
123
|
|
124
|
+
def for!(*args)
|
125
|
+
self.for(*args).tap do |result|
|
126
|
+
raise args.map { |c| (Class === c ? c : c.class).name.demodulize.pluralize }.join ' are not related to ' unless result
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
68
130
|
end
|
69
131
|
|
70
132
|
def records
|
@@ -17,6 +17,16 @@ module Netfira::WebConnect
|
|
17
17
|
settings[:locale] || Netfira::WebConnect.system_locale
|
18
18
|
end
|
19
19
|
|
20
|
+
def find_relation_by_origin_ids(**args)
|
21
|
+
raise ArgumentError, "Provide exactly 2 origin IDs, e.g. :product => 'abc'" unless args.length == 2
|
22
|
+
classes = args.keys.map do |type|
|
23
|
+
name = type.to_s.camelize.to_sym
|
24
|
+
Models.const_get(name).tap { |k| raise "#{type} isn't a valid record type. Use singular snake-case, e.g. :product" unless k < Model::Record }
|
25
|
+
end
|
26
|
+
relation_class = Model::Relation.for!(*classes)
|
27
|
+
relation_class.with_deleted.find_by_origin_ids(args.merge shop: self).first
|
28
|
+
end
|
29
|
+
|
20
30
|
end
|
21
31
|
end
|
22
32
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web-connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|