Rails 4迁移:has_and_belongs_to_many表名 [英] Rails 4 Migration: has_and_belongs_to_many table name
问题描述
我目前尝试将Rails 3.2应用程序切换到Rails 4.0。但是我有一个 has_and_belongs_many
模型的问题。
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:
创建了两个模型:foo_clip和foo_url
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
现在我已经为has_and_belongs_to_many表创建了迁移文件
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
现在我做了:
rake db:drop
rake db:create
rake db:migrate
rake db:seed
并收到此错误:
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
的顺序该表的postgres数据库称为:foo_clips_foo_urls
If I take a look at the postgres database the table is called: foo_clips_foo_urls
为什么会发生这种情况?
Any ideas why this happens?
推荐答案
我通过在每个模型中添加join_table名称来解决此问题,例如:
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
这篇关于Rails 4迁移:has_and_belongs_to_many表名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!