Commit 9f34767

mo khan <mo@mokhan.ca>
2013-07-21 00:51:55
extract primary key column class
1 parent 9ee879c
lib/humble/column.rb
@@ -1,40 +1,51 @@
 module Humble
   class Column
-    def initialize(attributes)
-      @attributes = attributes
+    def initialize(name)
+      @column_name = name
     end
 
     def prepare_insert(item)
       return {} if primary_key?
-      key = column_name
-      value = item.instance_variable_get("@#{key}")
-      { key.to_sym => value }
+      value = item.instance_variable_get("@#{column_name}")
+      { column_name.to_sym => value }
     end
 
     def prepare_update(item)
-      key = column_name
-      value = item.instance_variable_get("@#{key}")
-      { key.to_sym => value }
+      value = item.instance_variable_get("@#{column_name}")
+      { column_name.to_sym => value }
     end
 
     def primary_key?
-      @attributes[:primary_key]
+      false
     end
 
-    def column_name
-      @attributes[:name]
-    end
+    protected
+
+    attr_reader :column_name
+  end
 
-    def default
-      @attributes[:default]
+  class PrimaryKeyColumn < Column
+    attr_reader :default
+
+    def initialize(name, default)
+      super(name)
+      @default = default
     end
 
     def apply(id, entity)
-      entity.instance_variable_set("@#{column_name}", id ) if primary_key?
+      entity.instance_variable_set("@#{column_name}", id )
     end
 
     def destroy(connection, entity)
-      connection.where(column_name.to_sym => entity.id).delete if primary_key?
+      connection.where(column_name.to_sym => entity.id).delete
+    end
+
+    def primary_key?
+      true
+    end
+
+    def has_default_value?(item)
+      @default == item.id
     end
   end
 end
lib/humble/database_table.rb
@@ -11,15 +11,15 @@ module Humble
     end
 
     def primary_key(name, default: 0)
-      @columns << Column.new(:name => name, :default => default, :primary_key => true)
+      @primary_key = PrimaryKeyColumn.new(name, default)
     end
 
     def add_column(name)
-      @columns << Column.new(:name => name)
+      @columns << Column.new(name)
     end
 
     def persist(connection, item)
-      if has_default_value?(item)
+      if @primary_key.has_default_value?(item)
         insert(item, connection[@name])
       else
         update(item, connection[@name])
@@ -27,19 +27,11 @@ module Humble
     end
 
     def destroy(connection, entity)
-      primary_key_column.destroy(connection[@name], entity)
+      @primary_key.destroy(connection[@name], entity)
     end
 
     private
 
-    def has_default_value?(item)
-      primary_key_column.default == item.id
-    end
-
-    def primary_key_column
-      @columns.find { |x| x.primary_key? }
-    end
-
     def prepare_statement
       @columns.inject({}) do |result, column|
         result.merge(yield(column))
@@ -48,7 +40,7 @@ module Humble
 
     def insert(item, connection)
       id = connection.insert(prepare_statement { |column| column.prepare_insert(item) })
-      primary_key_column.apply(id, item)
+      @primary_key.apply(id, item)
     end
 
     def update(item, connection)
Gemfile.lock
@@ -1,7 +1,7 @@
 PATH
   remote: .
   specs:
-    humble (0.0.1374367205)
+    humble (0.0.1374367897)
       sequel
 
 GEM