Switch to a single joined table for Videos and Games
authorIra W. Snyder <devel@irasnyder.com>
Thu, 22 Nov 2007 04:18:18 +0000 (20:18 -0800)
committerIra W. Snyder <devel@irasnyder.com>
Thu, 22 Nov 2007 04:18:18 +0000 (20:18 -0800)
This is much simpler than the multiple inheritance thing, as well as making
things like getting all of the types and titles much easier.

Signed-off-by: Ira W. Snyder <devel@irasnyder.com>
12 files changed:
app/controllers/game_controller.rb
app/controllers/video_controller.rb
app/models/game.rb
app/models/rentable.rb
app/models/video.rb
app/views/game/_form.rhtml
app/views/rentable/_form.rhtml
app/views/rentable/list.rhtml
app/views/video/_form.rhtml
db/development.sqlite3
db/migrate/009_rentable_inheritance.rb [new file with mode: 0644]
db/schema.rb

index 1b57435..175a63f 100644 (file)
@@ -21,12 +21,7 @@ class GameController < ApplicationController
   end
 
   def create
-    # A new rentable must be created whenever we create a new game
-    @rentable = Rentable.new
-    @rentable.rtype = 'game'
-    @rentable.save
     @game = Game.new(params[:game])
-    @game.rentable_id = @rentable.id
     if @game.save
       flash[:notice] = 'Game was successfully created.'
       redirect_to :action => 'list'
index 4221c3c..a5508ae 100644 (file)
@@ -21,13 +21,7 @@ class VideoController < ApplicationController
   end
 
   def create
-    # A new rentable must be created and saved whenever we create a new
-    # video. This is so we have a rentable_id to add to the video.
-    @rentable = Rentable.new
-    @rentable.rtype = 'video'
-    @rentable.save!
     @video = Video.new(params[:video])
-    @video.rentable_id = @rentable.id
     if @video.save
       flash[:notice] = 'Video was successfully created.'
       redirect_to :action => 'list'
index 9880b04..4991aa9 100644 (file)
@@ -1,7 +1,4 @@
-class Game < ActiveRecord::Base
-  has_one :rentable
-
-  validates_presence_of :title
-  validates_presence_of :genre
+class Game < Rentable
+  validates_presence_of :game_genre
   validates_presence_of :platform
 end
index 0699a20..cccbb57 100644 (file)
@@ -1,6 +1,6 @@
 class Rentable < ActiveRecord::Base
   has_many :coitem
-  belongs_to :video
-  belongs_to :game
 
+  validates_presence_of :title
+  # don't validate newrelease, false is ok
 end
index 2ab598d..50733d5 100644 (file)
@@ -1,6 +1,5 @@
-class Video < ActiveRecord::Base
-  has_one :rentable
-
+class Video < Rentable
   validates_presence_of :director
-  validates_presence_of :genre
+  validates_presence_of :video_genre
+  validates_presence_of :media
 end
index a0ab990..b264601 100644 (file)
@@ -4,10 +4,13 @@
 <p><label for="game_title">Title</label><br/>
 <%= text_field 'game', 'title'  %></p>
 
+<p><label for="game_newrelease">New Release</label><br/>
+<%= check_box 'game', 'newrelease' %></p>
+
 <p><label for="game_platform">Platform</label><br/>
 <%= text_field 'game', 'platform'  %></p>
 
 <p><label for="game_genre">Genre</label><br/>
-<%= text_field 'game', 'genre'  %></p>
+<%= text_field 'game', 'game_genre'  %></p>
 <!--[eoform:game]-->
 
index a5b3ba2..475b7a1 100644 (file)
@@ -2,6 +2,6 @@
 
 <!--[form:rentable]-->
 <p><label for="rentable_type">Type</label><br/>
-<%= text_field 'rentable', 'rtype'  %></p>
+<%= text_field 'rentable', 'type'  %></p>
 <!--[eoform:rentable]-->
 
index 19f6f75..39883c5 100644 (file)
@@ -2,8 +2,6 @@
 
 <table>
   <tr>
-    <th>ID</th>
-    <th>Title</th>
   <% for column in Rentable.content_columns %>
     <th><%= column.human_name %></th>
   <% end %>
@@ -11,16 +9,6 @@
 
 <% for rentable in @rentables %>
   <tr>
-  <td><%=h rentable.id %></td>
-  <td>
-  <% if Game.find(:first, :conditions => "rentable_id='#{rentable.id}'") %>
-    Game
-  <% elsif Video.find(:first, :conditions => "rentable_id='#{rentable.id}'") %>
-    Video
-  <% else %>
-    ERROR
-  <% end %>
-  </td>
   <% for column in Rentable.content_columns %>
     <td><%=h rentable.send(column.name) %></td>
   <% end %>
index 8e903a2..10f345a 100644 (file)
@@ -5,12 +5,15 @@
 <%= text_field 'video', 'title' %></p>
 
 <p><label for="video_newrelease">Newrelease</label><br/>
-<select id="video_newrelease" name="video[newrelease]"><option value="false" selected>False</option><option value="true">True</option></select></p>
+<%= check_box 'video', 'newrelease' %></p>
+
+<p><label for="video_genre">Genre</label><br/>
+<%= text_field 'video', 'video_genre'  %></p>
 
 <p><label for="video_director">Director</label><br/>
 <%= text_field 'video', 'director'  %></p>
 
-<p><label for="video_genre">Genre</label><br/>
-<%= text_field 'video', 'genre'  %></p>
+<p><label for="video_media">Media</label><br/>
+<%= text_field 'video', 'media' %></p>
 <!--[eoform:video]-->
 
index c2859db..1c7c325 100644 (file)
Binary files a/db/development.sqlite3 and b/db/development.sqlite3 differ
diff --git a/db/migrate/009_rentable_inheritance.rb b/db/migrate/009_rentable_inheritance.rb
new file mode 100644 (file)
index 0000000..d0c2593
--- /dev/null
@@ -0,0 +1,46 @@
+class RentableInheritance < ActiveRecord::Migration
+  def self.up
+    drop_table :games
+    drop_table :videos
+    drop_table :rentables
+    create_table :rentables do |t|
+      # for the inheritance
+      t.column :type, :string
+
+      # common columns
+      t.column :title, :string
+      t.column :newrelease, :boolean, :default => false
+
+      # video specific
+      t.column :video_genre, :integer
+      t.column :director, :integer
+      t.column :media, :integer
+
+      # game specific
+      t.column :game_genre, :integer
+      t.column :platform, :integer
+    end
+  end
+
+  def self.down
+    create_table :games do |t|
+      t.column :title, :string
+      t.column :platform, :integer
+      t.column :genre, :integer
+      t.column :rentable_id, :integer
+    end
+    
+    create_table :videos do |t|
+      t.column :title, :string
+      t.column :newrelease, :boolean, :default => false
+      t.column :director, :string
+      t.column :genre, :integer
+      t.column :rentable_id, :integer
+    end
+
+    drop_table :rentables
+    create_table :rentables do |t|
+      t.column :rtype, :string
+    end
+  end
+end
index 885c6ee..692ee89 100644 (file)
@@ -2,7 +2,7 @@
 # migrations feature of ActiveRecord to incrementally modify your database, and
 # then regenerate this schema definition.
 
-ActiveRecord::Schema.define(:version => 8) do
+ActiveRecord::Schema.define(:version => 9) do
 
   create_table "coitems", :force => true do |t|
     t.column "customer_id", :integer
@@ -19,23 +19,15 @@ ActiveRecord::Schema.define(:version => 8) do
     t.column "debt",    :decimal, :precision => 8, :scale => 2, :default => 0.0
   end
 
-  create_table "games", :force => true do |t|
-    t.column "title",       :string
-    t.column "platform",    :integer
-    t.column "genre",       :integer
-    t.column "rentable_id", :integer
-  end
-
   create_table "rentables", :force => true do |t|
-    t.column "rtype", :string
-  end
-
-  create_table "videos", :force => true do |t|
-    t.column "rentable_id", :integer
-    t.column "newrelease",  :boolean, :default => false
-    t.column "director",    :string
-    t.column "genre",       :integer
+    t.column "type",        :string
     t.column "title",       :string
+    t.column "newrelease",  :boolean, :default => false
+    t.column "video_genre", :integer
+    t.column "director",    :integer
+    t.column "media",       :integer
+    t.column "game_genre",  :integer
+    t.column "platform",    :integer
   end
 
 end