Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 4 Migration: has_and_belongs_to_many table name

Tags:

I currently try to switch a rails 3.2 app to rails 4.0. But I have one problem with a has_and_belongs_many model.

I have created a test app and I have the same problem there. This is what I have done:

Created two models: foo_clip and foo_url

class FooClip < ActiveRecord::Base   has_and_belongs_to_many :foo_urls    attr_accessible :id, :name end   class FooUrl < ActiveRecord::Base   has_and_belongs_to_many :foo_clips    attr_accessible :url end 

After this I have updated the migration files:

class CreateFooClips < ActiveRecord::Migration   def change     create_table :foo_clips do |t|       t.string :name       t.timestamps     end   end end  class CreateFooUrls < ActiveRecord::Migration   def change     create_table :foo_urls do |t|       t.string :url       t.timestamps     end   end end 

Now I have created the migration file for the has_and_belongs_to_many table

class CreateFooClipsFooUrls < ActiveRecord::Migration   def change     create_table :foo_clips_foo_urls do |t|       t.belongs_to :foo_url       t.belongs_to :foo_clip     end   end end 

As last step I created a seed file for testing:

foourl1 = FooUrl.create!(:url => 'http://www.google.com') foourl2 = FooUrl.create!(:url => 'http://www.apple.com')  fooclip1 = FooClip.create!(:name => 'TestClip1')  fooclip1.foo_urls << foourl1 fooclip1.foo_urls << foourl2  fooclip1.save 

Now I did:

rake db:drop rake db:create rake db:migrate rake db:seed 

And got this error:

PG::UndefinedTable: ERROR:  relation "foo_clips_urls" does not exist LINE 5:         WHERE a.attrelid = '"foo_clips_urls"'::regcla...                                           ^ :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),                pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod                 FROM pg_attribute a LEFT JOIN pg_attrdef d                   ON a.attrelid = d.adrelid AND a.attnum = d.adnum                WHERE a.attrelid = '"foo_clips_urls"'::regclass                  AND a.attnum > 0 AND NOT a.attisdropped                ORDER BY a.attnum 

If I take a look at the postgres database the table is called: foo_clips_foo_urls

Any ideas why this happens?

like image 521
patrickS Avatar asked Feb 04 '14 09:02

patrickS


1 Answers

I fixed the problem by adding the join_table name to every model like:

has_and_belongs_to_many :foo_urls,  :join_table => :foo_clips_foo_urls 
like image 186
patrickS Avatar answered Jan 01 '23 22:01

patrickS