<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/belongs_to_spec.rb</filename>
    </added>
    <added>
      <filename>test/has_n_spec.rb</filename>
    </added>
    <added>
      <filename>test/has_one_spec.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -82,6 +82,7 @@ module Ribs
   Column = org.hibernate.mapping.Column
   Property = org.hibernate.mapping.Property
   SimpleValue = org.hibernate.mapping.SimpleValue
+  ManyToOne = org.hibernate.mapping.ManyToOne
 
   # A simple helper class that allows the Java parts of the system to
   # get the Ruby class from the PersistentClass instance.
@@ -133,6 +134,10 @@ module Ribs
   end
   
   class &lt;&lt; self
+    def ensure_valid_entity_name(db, name)
+      R(eval(name), db || :default)
+    end
+
     # Define a rib for the class +on+. If a block is given, will first
     # yield an instance of Rib to it and then base the mapping
     # definition on that.
@@ -161,7 +166,6 @@ module Ribs
       rm.rib = rib
       rib_data = rib.__column_data__
       
-      
       db = nil
       with_handle(options[:db] || :default) do |h|
         db = h.db
@@ -206,18 +210,21 @@ module Ribs
           
           table.column_iterator.each do |c|
             unless rib_data.to_avoid.include?(c.name.downcase)
-              prop = Property.new
-              prop.persistent_class = pc
-              prop.name = ((v=rib_data.columns.find{ |key, val| val[0].to_s.downcase == c.name.downcase}) &amp;&amp; v[0]) || c.name
-              val = SimpleValue.new(table)
-              val.add_column(c)
-              val.type_name = get_type_for_sql(c.sql_type, c.sql_type_code)
-              prop.value = val
-              if (!rib_data.primary_keys.empty? &amp;&amp; rib_data.primary_keys.include?(prop.name)) || c.name.downcase == 'id'
-                pc.identifier_property = prop
-                pc.identifier = val
-              else
-                pc.add_property(prop)
+              col_data = rib_data.columns.find{ |key, val| val[0].to_s.downcase == c.name.downcase} || [c.name, {}]
+              unless col_data[1].length == 3 # It's an association
+                prop = Property.new
+                prop.persistent_class = pc
+                prop.name = col_data[0]
+                val = SimpleValue.new(table)
+                val.add_column(c)
+                val.type_name = get_type_for_sql(c.sql_type, c.sql_type_code)
+                prop.value = val
+                if (!rib_data.primary_keys.empty? &amp;&amp; rib_data.primary_keys.include?(prop.name)) || c.name.downcase == 'id'
+                  pc.identifier_property = prop
+                  pc.identifier = val
+                else
+                  pc.add_property(prop)
+                end
               end
             else
               if !c.nullable
@@ -233,6 +240,19 @@ module Ribs
               end
             end
           end
+
+          rib_data.associations[:belongs_to].each do |col_name, definition|
+            prop = Property.new
+            prop.persistent_class = pc
+            prop.name = definition[0]
+            val = ManyToOne.new(table)
+            val.add_column(table.get_column(Column.new(col_name)))
+            ensure_valid_entity_name(options[:db], definition[1])
+            val.referenced_entity_name = definition[1]
+            prop.value = val
+            pc.add_property(prop)
+          end
+          
           pc.create_primary_key
           db.mappings.add_class(pc)
         else</diff>
      <filename>lib/ribs/definition.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,9 +38,12 @@ module Ribs
       # List of default values for columns
       attr_reader :default_values
 
+      attr_reader :associations
+
       # Sets all values
-      def initialize(columns, primary_keys, to_avoid, default_values)
-        @columns, @primary_keys, @to_avoid, @default_values = columns, primary_keys, to_avoid, default_values
+      def initialize(columns, primary_keys, to_avoid, default_values, associations)
+        @columns, @primary_keys, @to_avoid, @default_values, @associations = 
+          columns, primary_keys, to_avoid, default_values, associations
       end
     end
 
@@ -55,14 +58,35 @@ module Ribs
       @primary_keys = []
       @to_avoid = []
       @default_values = { }
+      @associations = 
+        {
+        :belongs_to =&gt; { },
+        :has_one    =&gt; { },
+        :has_n      =&gt; { }
+        }
     end
     
     # Returns a reference object that allow access to the resulting
     # data objects
     def __column_data__
-      ColumnData.new(@columns, @primary_keys, @to_avoid, @default_values)
+      ColumnData.new(@columns, @primary_keys, @to_avoid, @default_values, @associations)
     end
 
+    def belongs_to(*args)
+      if args==[] || args.first.is_a?(Hash) || [:primary_key, :avoid, :default].include?(args.first)
+        method_missing(:belongs_to, *args)
+      else
+        opts = args.grep(Hash).first || {}
+        simple_name = args.first.to_s
+        name = simple_name.gsub(/([[:lower:]][0-9]*)([[:upper:]]+)/, '\1_\2').downcase
+
+        opts = {:column =&gt; &quot;#{name}_id&quot;}.merge(opts)
+
+        @columns[name] = [opts[:column].to_s, opts, :belongs_to]
+        @associations[:belongs_to][opts[:column]] = [name, simple_name, opts[:column], opts]
+      end
+    end
+    
     # Handles property names. The only ones that aren't possibly to
     # use is &quot;initialize&quot;, &quot;__column_data__&quot;, &quot;__id__&quot;,
     # &quot;method_missing&quot; and &quot;__send__&quot;. Everything else is</diff>
      <filename>lib/ribs/rib.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.join(File.dirname(__FILE__), 'test_helper')
 
-Ribs::define_model :Address do |rib|
-  rib.zip_code :column =&gt; :zip
+Ribs::define_model :Address do |address|
+  address.zip_code :column =&gt; :zip
 end
 
 describe &quot;define_model&quot; do </diff>
      <filename>test/define_model_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ describe Ribs::Rib do
   it &quot;should not have any methods defined except for method_missing&quot; do 
     Ribs::Rib.instance_methods.sort.should == 
       %w(Ribs! __send__ __id__ rspec_reset 
-         rspec_verify should_receive 
+         rspec_verify should_receive belongs_to
          should_not_receive R received_message? 
          stub! __column_data__ method_missing).sort
   end</diff>
      <filename>test/rib_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -112,6 +112,20 @@ SQL
   PRIMARY KEY (ID)
 SQL
 
+    delete_or_create(h, &quot;blog&quot;,&lt;&lt;SQL)
+  ID INT NOT NULL,
+  name VARCHAR(255),
+  owner_id INT NOT NULL,
+  PRIMARY KEY (ID)
+SQL
+
+    delete_or_create(h, &quot;owner&quot;,&lt;&lt;SQL)
+  ID INT NOT NULL,
+  name VARCHAR(255),
+  blog_id INT NOT NULL,
+  PRIMARY KEY (ID)
+SQL
+    
     template = &lt;&lt;SQL
 INSERT INTO DB_TRACK(TRACK_ID, title, filePath, playTime, added, volume, lastPlayed, data, description, fraction, otherFraction, good, price) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 SQL
@@ -126,6 +140,14 @@ SQL
              [1, &quot;Public Image Ltd&quot;],
              [2, &quot;New Model Army&quot;],
              [3, &quot;David Bowie&quot;])
+
+    h.insert(&quot;INSERT INTO blog(ID, name, owner_id) VALUES(?, ?, ?)&quot;, 
+             [1, &quot;One&quot;, 1],
+             [2, &quot;Two&quot;, 2])
+
+    h.insert(&quot;INSERT INTO owner(ID, name, blog_id) VALUES(?, ?, ?)&quot;, 
+             [1, &quot;Foo&quot;, 2],
+             [2, &quot;Bar&quot;, 1])
   end
 end
 </diff>
      <filename>test/test_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,20 +13,20 @@ class Track
   attr_accessor :full_price
   attr_accessor :volume
 
-  Ribs! :table =&gt; :DB_TRACK, :identity_map =&gt; false do |rib|
-    rib.TRACK_ID.primary_key!
-
-    rib.track_title    :column =&gt; :title
-    rib.time           :column =&gt; :playTime
-    rib.date_added     :column =&gt; :added
-    rib.last_played_at :column =&gt; :lastPlayed
-    rib.file_data      :column =&gt; :data
-    rib.desc           :column =&gt; :description
-    rib.some_fraction  :column =&gt; :fraction
-    rib.is_good        :column =&gt; :good
-    rib.full_price     :column =&gt; :price
-
-    rib.filePath :avoid, :default =&gt; &quot;fluxie&quot;
+  Ribs! :table =&gt; :DB_TRACK, :identity_map =&gt; false do |track|
+    track.TRACK_ID.primary_key!
+
+    track.track_title    :column =&gt; :title
+    track.time           :column =&gt; :playTime
+    track.date_added     :column =&gt; :added
+    track.last_played_at :column =&gt; :lastPlayed
+    track.file_data      :column =&gt; :data
+    track.desc           :column =&gt; :description
+    track.some_fraction  :column =&gt; :fraction
+    track.is_good        :column =&gt; :good
+    track.full_price     :column =&gt; :price
+
+    track.filePath :avoid, :default =&gt; &quot;fluxie&quot;
   end
 end
 </diff>
      <filename>test/track_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>df01c4776dfef0ff057abcdd5bfbdefc25a9f629</id>
    </parent>
  </parents>
  <author>
    <name>Ola Bini</name>
    <email>ola.bini@gmail.com</email>
  </author>
  <url>http://github.com/olabini/ribs/commit/c50b441acf55e7ad3a9f25f2a2ca01bca093c9ca</url>
  <id>c50b441acf55e7ad3a9f25f2a2ca01bca093c9ca</id>
  <committed-date>2008-10-09T06:42:15-07:00</committed-date>
  <authored-date>2008-10-09T06:42:15-07:00</authored-date>
  <message>Add support for simple belongs_to association</message>
  <tree>6738bfbf98566a34de51ca94c23cdbfe567095ee</tree>
  <committer>
    <name>Ola Bini</name>
    <email>ola.bini@gmail.com</email>
  </committer>
</commit>
