Scaffolding ActiveRecord: two columns of the same data type Scaffolding ActiveRecord: two columns of the same data type ruby-on-rails ruby-on-rails

Scaffolding ActiveRecord: two columns of the same data type


Just to tidy things up a bit, in your migration you can now also do:

create_table :videogames do |t|  t.belongs_to :developer  t.belongs_to :publisherend

And since you're calling the keys developer_id and publisher_id, the model should probably be:

belongs_to :developer, :class_name => "Company"belongs_to :publisher, :class_name => "Company"

It's not a major problem, but I find that as the number of associations with extra arguments get added, the less clear things become, so it's best to stick to the defaults whenever possible.


I have no idea how to do this with script/generate.

The underlying idea is easier to show without using script/generate anyway. You want two fields in your videogames table/model that hold the foreign keys to the companies table/model.

I'll show you what I think the code would look like, but I haven't tested it, so I could be wrong.

Your migration file has:

create_table :videogames do |t|  # all your other fields  t.int :developer_id  t.int :publisher_idend

Then in your model:

belongs_to :developer, class_name: "Company", foreign_key: "developer_id"belongs_to :publisher, class_name: "Company", foreign_key: "publisher_id"

You also mention wanting the two companies to be distinct, which you could handle in a validation in the model that checks that developer_id != publisher_id.


If there are any methods or validation you want specific to a certain company type, you could sub class the company model. This employs a technique called single table inheritance. For more information check out this article: http://wiki.rubyonrails.org/rails/pages/singletableinheritance

You would then have:

#db/migrate/###_create_companiesclass CreateCompanies < ActiveRecord::Migration  def self.up    create_table :companies do |t|      t.string :type  # required so rails know what type of company a record is      t.timestamps    end  end  def self.down    drop_table :companies  endend#db/migrate/###_create_videogamesclass CreateVideogames < ActiveRecord::Migration  create_table :videogames do |t|    t.belongs_to :developer    t.belongs_to :publisher  end      def self.down    drop_table :videogames  endend#app/models/company.rbclass Company < ActiveRecord::Base   has_many :videogames  common validations and methodsend#app/models/developer.rbclass Developer < Company  developer specific codeend#app/models/publisher.rbclass Publisher < Company  publisher specific codeend#app/models/videogame.rbclass Videogame < ActiveRecord::Base   belongs_to :developer, :publisherend

As a result, you would have Company, Developer and Publisher models to use.

 Company.find(:all) Developer.find(:all) Publisher.find(:all)