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)