Skip to content

Instantly share code, notes, and snippets.

@kastner
Created May 13, 2009 14:16

Revisions

  1. kastner revised this gist May 13, 2009. 1 changed file with 58 additions and 54 deletions.
    112 changes: 58 additions & 54 deletions ar_playground_for_so.rb
    Original file line number Diff line number Diff line change
    @@ -1,67 +1,71 @@
    #!/usr/bin/env ruby
    %w|rubygems active_record irb|.each {|lib| require lib}
    ActiveSupport::Inflector.inflections.singular("toyota", "toyota")
    CAR_TYPES = %w|ford buick toyota|
    #!/usr/bin/env ruby
    %w|rubygems active_record irb|.each {|lib| require lib}
    ActiveSupport::Inflector.inflections.singular("toyota", "toyota")

    ActiveRecord::Base.logger = Logger.new(STDOUT)
    ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3",
    :database => ":memory:"
    )
    ActiveRecord::Base.logger = Logger.new(STDOUT)
    ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3",
    :database => ":memory:"
    )

    ActiveRecord::Schema.define do
    create_table :cars do |t|
    t.string :name
    end
    ActiveRecord::Schema.define do
    create_table :cars do |t|
    t.string :name
    end

    create_table :car_to_wheel_table_map, :id => false do |t|
    t.integer :car_id
    t.string :wheel_table
    end

    CAR_TYPES.each do |car_type|
    create_table "wheels_for_#{car_type.pluralize}" do |t|
    t.integer :car_id
    t.string :color
    end
    end
    end
    create_table :car_to_wheel_table_map, :id => false do |t|
    t.integer :car_id
    t.string :wheel_table
    end

    create_table :wheels_for_fords do |t|
    t.integer :car_id
    t.string :color
    end

    create_table :wheels_for_toyotas do |t|
    t.integer :car_id
    t.string :color
    end
    end

    class Wheel < ActiveRecord::Base
    set_table_name nil
    belongs_to :car
    end

    class CarWheelMap < ActiveRecord::Base
    set_table_name "car_to_wheel_table_map"
    belongs_to :car
    end

    CAR_TYPES.each do |car_type|
    class Car < ActiveRecord::Base
    has_one :car_wheel_map
    delegate :wheel_table, :to => :car_wheel_map

    def wheels
    @wheels ||= begin
    the_klass = "#{wheel_table.classify}Wheel"
    eval <<-END
    class #{car_type.classify}Wheel < ActiveRecord::Base
    set_table_name "wheels_for_#{car_type.pluralize}"
    class #{the_klass} < ActiveRecord::Base
    set_table_name "wheels_for_#{wheel_table.pluralize}"
    belongs_to :car
    end
    END

    self.class.send(:has_many, "#{wheel_table}_wheels")
    send "#{wheel_table}_wheels"
    end
    end
    end

    class Car < ActiveRecord::Base
    has_one :car_wheel_map

    CAR_TYPES.each do |car_type|
    has_many "#{car_type}_wheels"
    end

    delegate :wheel_table, :to => :car_wheel_map

    def wheels
    send("#{wheel_table}_wheels")
    end
    end

    class CarWheelMap < ActiveRecord::Base
    set_table_name "car_to_wheel_table_map"
    belongs_to :car
    end

    rav4 = Car.create(:name => "Rav4")
    rav4.create_car_wheel_map(:wheel_table => "toyota")

    rav4 = Car.create(:name => "Rav4")
    rav4.create_car_wheel_map(:wheel_table => "toyota")
    rav4.wheels.create(:color => "red")
    fiesta = Car.create(:name => "Fiesta")
    fiesta.create_car_wheel_map(:wheel_table => "ford")

    fiesta = Car.create(:name => "Fiesta")
    fiesta.create_car_wheel_map(:wheel_table => "ford")
    fiesta.wheels.create(:color => "green")
    rav4.wheels.create(:color => "red")
    fiesta.wheels.create(:color => "green")

    IRB.start if __FILE__ == $0
    # IRB.start if __FILE__ == $0
  2. kastner renamed this gist May 13, 2009. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  3. kastner created this gist May 13, 2009.
    67 changes: 67 additions & 0 deletions snippet.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,67 @@
    #!/usr/bin/env ruby
    %w|rubygems active_record irb|.each {|lib| require lib}
    ActiveSupport::Inflector.inflections.singular("toyota", "toyota")
    CAR_TYPES = %w|ford buick toyota|

    ActiveRecord::Base.logger = Logger.new(STDOUT)
    ActiveRecord::Base.establish_connection(
    :adapter => "sqlite3",
    :database => ":memory:"
    )

    ActiveRecord::Schema.define do
    create_table :cars do |t|
    t.string :name
    end

    create_table :car_to_wheel_table_map, :id => false do |t|
    t.integer :car_id
    t.string :wheel_table
    end

    CAR_TYPES.each do |car_type|
    create_table "wheels_for_#{car_type.pluralize}" do |t|
    t.integer :car_id
    t.string :color
    end
    end
    end

    CAR_TYPES.each do |car_type|
    eval <<-END
    class #{car_type.classify}Wheel < ActiveRecord::Base
    set_table_name "wheels_for_#{car_type.pluralize}"
    belongs_to :car
    end
    END
    end

    class Car < ActiveRecord::Base
    has_one :car_wheel_map

    CAR_TYPES.each do |car_type|
    has_many "#{car_type}_wheels"
    end

    delegate :wheel_table, :to => :car_wheel_map

    def wheels
    send("#{wheel_table}_wheels")
    end
    end

    class CarWheelMap < ActiveRecord::Base
    set_table_name "car_to_wheel_table_map"
    belongs_to :car
    end


    rav4 = Car.create(:name => "Rav4")
    rav4.create_car_wheel_map(:wheel_table => "toyota")
    rav4.wheels.create(:color => "red")

    fiesta = Car.create(:name => "Fiesta")
    fiesta.create_car_wheel_map(:wheel_table => "ford")
    fiesta.wheels.create(:color => "green")

    IRB.start if __FILE__ == $0