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'
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'
-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
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
-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
<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]-->
<!--[form:rentable]-->
<p><label for="rentable_type">Type</label><br/>
-<%= text_field 'rentable', 'rtype' %></p>
+<%= text_field 'rentable', 'type' %></p>
<!--[eoform:rentable]-->
<table>
<tr>
- <th>ID</th>
- <th>Title</th>
<% for column in Rentable.content_columns %>
<th><%= column.human_name %></th>
<% end %>
<% 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 %>
<%= 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]-->
--- /dev/null
+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
# 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
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