has_dynamic_columns 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/has_dynamic_columns/version.rb +1 -1
- data/lib/has_dynamic_columns.rb +32 -24
- data/spec/has_dynamic_columns_spec.rb +50 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69d28ea4aadd2689e5653aceb6092dd913dbb831
|
4
|
+
data.tar.gz: 26a14d5b8a98d70565094e588f2a40ee3355de01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cff1aba3d57c28d9ebe93d660555a6959e064546c5d16768bdc308836fc89facdbd46b578cd94adfccc0c18b8e7dd40019a8a9d694d2912d0d53c050bf6a5f66
|
7
|
+
data.tar.gz: 9981d60459e0c61e76247ac59a11fe9a7558ec3429026de3904dd05a1e0c59cbc9957ede55a120d1896e50291ee8cba17f06dc9b1c0a8cd7f790ddf6b2e19b66
|
data/lib/has_dynamic_columns.rb
CHANGED
@@ -87,7 +87,7 @@ module HasDynamicColumns
|
|
87
87
|
# If any errors exist - add them
|
88
88
|
if validation_errors.length > 0
|
89
89
|
if dynamic_column.nil?
|
90
|
-
|
90
|
+
# TODO - fix from the has_many - need to fix validations
|
91
91
|
#errors.add(:dynamic_columns, { "unknown" => validation_errors })
|
92
92
|
else
|
93
93
|
errors.add(:dynamic_columns, { dynamic_column.key.to_s => validation_errors })
|
@@ -105,20 +105,26 @@ module HasDynamicColumns
|
|
105
105
|
column_table = HasDynamicColumns::DynamicColumn.arel_table.alias("dynamic_order_"+key.to_s)
|
106
106
|
column_datum_table = HasDynamicColumns::DynamicColumnDatum.arel_table.alias("dynamic_order_data_"+key.to_s)
|
107
107
|
|
108
|
-
|
108
|
+
field_scope_id = (!field_scope.nil?) ? field_scope.id : nil
|
109
|
+
field_scope_type = (!field_scope.nil?) ? field_scope.class.name.constantize.to_s : nil
|
109
110
|
dynamic_type = self.name.constantize.to_s
|
110
|
-
field_scope_id = field_scope.id
|
111
111
|
|
112
112
|
# Join on the column with the key
|
113
|
+
on_query = column_table[:key].eq(key)
|
114
|
+
if !field_scope_type.nil?
|
115
|
+
on_query = on_query.and(
|
116
|
+
column_table[:field_scope_type].eq(field_scope_type)
|
117
|
+
)
|
118
|
+
end
|
119
|
+
if !field_scope_id.nil?
|
120
|
+
on_query = on_query.and(
|
121
|
+
column_table[:field_scope_id].eq(field_scope_id)
|
122
|
+
)
|
123
|
+
end
|
124
|
+
|
113
125
|
column_table_join_on = column_table
|
114
126
|
.create_on(
|
115
|
-
|
116
|
-
column_table[:dynamic_type].eq(dynamic_type)
|
117
|
-
).and(
|
118
|
-
column_table[:field_scope_id].eq(field_scope_id)
|
119
|
-
).and(
|
120
|
-
column_table[:key].eq(key)
|
121
|
-
)
|
127
|
+
on_query
|
122
128
|
)
|
123
129
|
|
124
130
|
column_table_join = table.create_join(column_table, column_table_join_on)
|
@@ -148,12 +154,12 @@ module HasDynamicColumns
|
|
148
154
|
|
149
155
|
# Find by dynamic columns
|
150
156
|
def self.dynamic_where(*args)
|
151
|
-
field_scope = args[0]
|
157
|
+
field_scope = args[0].is_a?(Hash) ? nil : args[0]
|
152
158
|
options = args.extract_options!
|
153
159
|
|
154
|
-
|
160
|
+
field_scope_id = (!field_scope.nil?) ? field_scope.id : nil
|
161
|
+
field_scope_type = (!field_scope.nil?) ? field_scope.class.name.constantize.to_s : nil
|
155
162
|
dynamic_type = self.name.constantize.to_s
|
156
|
-
field_scope_id = field_scope.id
|
157
163
|
|
158
164
|
table = self.name.constantize.arel_table
|
159
165
|
query = nil
|
@@ -167,15 +173,21 @@ module HasDynamicColumns
|
|
167
173
|
column_datum_table = HasDynamicColumns::DynamicColumnDatum.arel_table.alias("dynamic_where_data_"+key.to_s)
|
168
174
|
|
169
175
|
# Join on the column with the key
|
176
|
+
on_query = column_table[:key].eq(key)
|
177
|
+
if !field_scope_type.nil?
|
178
|
+
on_query = on_query.and(
|
179
|
+
column_table[:field_scope_type].eq(field_scope_type)
|
180
|
+
)
|
181
|
+
end
|
182
|
+
if !field_scope_id.nil?
|
183
|
+
on_query = on_query.and(
|
184
|
+
column_table[:field_scope_id].eq(field_scope_id)
|
185
|
+
)
|
186
|
+
end
|
187
|
+
|
170
188
|
column_table_join_on = column_table
|
171
189
|
.create_on(
|
172
|
-
|
173
|
-
column_table[:dynamic_type].eq(dynamic_type)
|
174
|
-
).and(
|
175
|
-
column_table[:field_scope_id].eq(field_scope_id)
|
176
|
-
).and(
|
177
|
-
column_table[:key].eq(key)
|
178
|
-
)
|
190
|
+
on_query
|
179
191
|
)
|
180
192
|
|
181
193
|
column_table_join = table.create_join(column_table, column_table_join_on)
|
@@ -292,10 +304,6 @@ module HasDynamicColumns
|
|
292
304
|
end
|
293
305
|
|
294
306
|
module InstanceMethods
|
295
|
-
# Validate all the dynamic_column_data at once
|
296
|
-
def validate_dynamic_column_data(field_scope = nil)
|
297
|
-
|
298
|
-
end
|
299
307
|
end
|
300
308
|
end
|
301
309
|
end
|
@@ -67,6 +67,56 @@ describe HasDynamicColumns do
|
|
67
67
|
context 'when it has a defined has_many relationship' do
|
68
68
|
|
69
69
|
context 'when it has_many categories' do
|
70
|
+
it 'should work with dynamic_where' do
|
71
|
+
product1 = Product.new(:name => "Product #1", :account => account)
|
72
|
+
product2 = Product.new(:name => "Product #2", :account => account)
|
73
|
+
|
74
|
+
# Product 1 is associated with both categories
|
75
|
+
product1.categories << @category1
|
76
|
+
product1.categories << @category2
|
77
|
+
# Product 2 is only associated with a single category
|
78
|
+
product2.categories << @category1
|
79
|
+
|
80
|
+
product1.product_fields = {
|
81
|
+
"rarity" => "very rare"
|
82
|
+
}
|
83
|
+
product2.product_fields = {
|
84
|
+
"rarity" => "kinda rare"
|
85
|
+
}
|
86
|
+
|
87
|
+
product1.category_fields = {
|
88
|
+
"vin_number" => "abc",
|
89
|
+
"serial_number" => "456"
|
90
|
+
}
|
91
|
+
product2.category_fields = {
|
92
|
+
"vin_number" => "cde",
|
93
|
+
}
|
94
|
+
product1.save
|
95
|
+
product2.save
|
96
|
+
|
97
|
+
result = Product.dynamic_where({ vin_number: "abc" })
|
98
|
+
expect(result.length).to eq(1)
|
99
|
+
expect(result.first).to eq(product1)
|
100
|
+
|
101
|
+
result = Product.dynamic_where({ vin_number: "cde" })
|
102
|
+
expect(result.length).to eq(1)
|
103
|
+
expect(result.first).to eq(product2)
|
104
|
+
|
105
|
+
result = Product.dynamic_where({ rarity: "rare" })
|
106
|
+
expect(result.length).to eq(2)
|
107
|
+
expect(result.first).to eq(product1)
|
108
|
+
expect(result.last).to eq(product2)
|
109
|
+
|
110
|
+
result = Product.dynamic_where({ rarity: "rare", vin_number: "cde" })
|
111
|
+
expect(result.length).to eq(1)
|
112
|
+
expect(result.first).to eq(product2)
|
113
|
+
|
114
|
+
result = Product.dynamic_where({ rarity: "rare", vin_number: "cde", serial_number: "456" })
|
115
|
+
expect(result.length).to eq(0)
|
116
|
+
|
117
|
+
result = Product.dynamic_where({ rarity: "rare", vin_number: "c", serial_number: "456" })
|
118
|
+
expect(result.length).to eq(1)
|
119
|
+
end
|
70
120
|
|
71
121
|
it 'should return empty category_fields when no categories associated' do
|
72
122
|
json = product.as_json
|