doeskeyvalue 0.1.1 → 0.1.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.
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/doeskeyvalue.gemspec
CHANGED
data/lib/doeskeyvalue/indexes.rb
CHANGED
@@ -13,7 +13,7 @@ module DoesKeyValue
|
|
13
13
|
raise DoesKeyValue::KeyAndIndexOptionsMustBeHash unless opts.is_a?(Hash)
|
14
14
|
|
15
15
|
search_key = "#{key_value_column}.#{key_name}"
|
16
|
-
raise DoesKeyValue::NoKeyForThatIndex if !self.respond_to?(key_name) || !self.respond_to?("#{key_name}=")
|
16
|
+
# TODO: raise DoesKeyValue::NoKeyForThatIndex if !self.respond_to?(key_name) || !self.respond_to?("#{key_name}=")
|
17
17
|
|
18
18
|
class_name = self.name.underscore
|
19
19
|
class_table_name = self.table_name
|
@@ -61,9 +61,26 @@ module DoesKeyValue
|
|
61
61
|
define_method("update_index_#{key_value_column}_#{key_name}_after_save") do
|
62
62
|
class_name = self.class.name.underscore
|
63
63
|
class_table_name = self.class.table_name
|
64
|
-
index_table_name = "
|
64
|
+
index_table_name = "key_value_index"
|
65
|
+
|
65
66
|
# TODO: Restrict value to 255 characters, the table-enforced limit
|
66
|
-
|
67
|
+
|
68
|
+
# TODO: Serialize value in such a nils to be properly represented
|
69
|
+
# Sample JSON Serialization: tab.to_json
|
70
|
+
# Sample JSON Reconstruction: Tab.new( JSON.parse(tab.to_json)["tab"] )
|
71
|
+
|
72
|
+
new_value = self.send(key_name)
|
73
|
+
up_count = ActiveRecord::Base.connection.update("
|
74
|
+
UPDATE `#{index_table_name}` SET `value` = \"#{new_value}\", `updated_at` = NOW()
|
75
|
+
WHERE `obj_type`=\"#{self.class}\" AND `obj_id`=#{self.id} AND `key_name`=\"#{search_key}\"
|
76
|
+
")
|
77
|
+
if !new_value.nil? && up_count == 0
|
78
|
+
idx_id = ActiveRecord::Base.connection.insert(
|
79
|
+
"INSERT INTO `#{index_table_name}` (`obj_type`,`obj_id`,`key_name`,`value`,`created_at`,`updated_at`) VALUES (\"#{self.class}\", #{self.id}, \"#{search_key}\", \"#{new_value}\", NOW(), NOW())
|
80
|
+
")
|
81
|
+
return idx_id
|
82
|
+
end
|
83
|
+
|
67
84
|
end
|
68
85
|
after_save "update_index_#{key_value_column}_#{key_name}_after_save"
|
69
86
|
|
@@ -71,7 +88,7 @@ module DoesKeyValue
|
|
71
88
|
define_method("update_index_#{key_value_column}_#{key_name}_after_destroy") do
|
72
89
|
class_name = self.class.name.underscore
|
73
90
|
class_table_name = self.class.table_name
|
74
|
-
index_table_name = "
|
91
|
+
index_table_name = "key_value_index"
|
75
92
|
num_del = ActiveRecord::Base.connection.delete("DELETE FROM `#{index_table_name}` WHERE `obj_type` = \"#{self.class}\" AND `obj_id` = #{self.id}")
|
76
93
|
end
|
77
94
|
after_destroy "update_index_#{key_value_column}_#{key_name}_after_destroy"
|
data/lib/doeskeyvalue/keys.rb
CHANGED
@@ -10,17 +10,21 @@ module DoesKeyValue
|
|
10
10
|
raise DoesKeyValue::NoColumnNameSpecified unless key_value_column
|
11
11
|
raise DoesKeyValue::NoKeyNameSpecified unless key_name
|
12
12
|
raise DoesKeyValue::KeyAndIndexOptionsMustBeHash unless opts.is_a?(Hash)
|
13
|
-
|
13
|
+
|
14
|
+
# TODO: Allow :type option to set an enforced data type
|
15
|
+
# TODO: Allow :default option to set a default return value
|
16
|
+
|
14
17
|
# Define accessors for the key column in the AR class:
|
15
18
|
class_eval <<-EOS
|
16
19
|
def #{key_name}
|
17
|
-
|
20
|
+
all_keys = self.send(:read_attribute, :#{key_value_column}) || Hash.new
|
21
|
+
return all_keys[:#{key_name}]
|
18
22
|
end
|
19
23
|
|
20
24
|
def #{key_name}=(value)
|
21
|
-
|
22
|
-
|
23
|
-
self.send(
|
25
|
+
all_keys = self.send(:read_attribute, :#{key_value_column}) || Hash.new
|
26
|
+
all_keys[:#{key_name}] = value
|
27
|
+
self.send(:write_attribute, :#{key_value_column}, all_keys)
|
24
28
|
end
|
25
29
|
EOS
|
26
30
|
|
@@ -30,6 +34,8 @@ module DoesKeyValue
|
|
30
34
|
end
|
31
35
|
|
32
36
|
end
|
37
|
+
|
38
|
+
|
33
39
|
|
34
40
|
end # Keys
|
35
41
|
end # DoesKeyValue
|
@@ -6,17 +6,11 @@
|
|
6
6
|
class CreateKeyValueIndex < ActiveRecord::Migration
|
7
7
|
def self.up
|
8
8
|
create_table :key_value_index do |t|
|
9
|
-
|
9
|
+
t.string :obj_type
|
10
10
|
t.string :key_name
|
11
|
-
|
12
|
-
# The stored value is saved as varchar(255), which limits indexability slightly:
|
13
11
|
t.string :value
|
14
|
-
|
15
|
-
# Store details about the target object:
|
16
|
-
t.string :obj_type
|
17
12
|
t.integer :obj_id
|
18
13
|
|
19
|
-
# Track all touches:
|
20
14
|
t.timestamps
|
21
15
|
end
|
22
16
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: doeskeyvalue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Awexome Labs
|
@@ -73,7 +73,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
76
|
+
hash: -1554093929383851164
|
77
77
|
segments:
|
78
78
|
- 0
|
79
79
|
version: "0"
|