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
1
+ 0.1.2
data/doeskeyvalue.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{doeskeyvalue}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Awexome Labs"]
@@ -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 = "key_value_indexes"
64
+ index_table_name = "key_value_index"
65
+
65
66
  # TODO: Restrict value to 255 characters, the table-enforced limit
66
- idx_id = ActiveRecord::Base.connection.insert("INSERT INTO `#{index_table_name}` (`obj_type`,`obj_id`,`key_name`,`value`) VALUES (\""+self.class.to_s+"\","+self.id.to_s+", \""+search_key.to_s+"\", \"#{self.send(key_name).to_s}\")")
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 = "key_value_indexes"
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"
@@ -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
- return (self.send(:#{key_value_column}) || Hash.new)[:#{key_name}]
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
- key_set = self.send(:#{key_value_column}) || Hash.new
22
- key_set[:#{key_name}] = value
23
- self.send("#{key_value_column}=", key_set)
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
- # The key is a composite of the grouping and key name (e.g., "settings.user_id")
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.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: 136860461958198637
76
+ hash: -1554093929383851164
77
77
  segments:
78
78
  - 0
79
79
  version: "0"