Ответ 1
Я исправил проблему, добавив имя join_table в каждую модель, например:
has_and_belongs_to_many :foo_urls, :join_table => :foo_clips_foo_urls
В настоящее время я пытаюсь переключить приложение rails 3.2 на rails 4.0. Но у меня есть одна проблема с моделью has_and_belongs_many
.
Я создал тестовое приложение, и у меня такая же проблема. Это то, что я сделал:
Созданы две модели: foo_clip и 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
После этого я обновил файлы миграции:
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
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
В качестве последнего шага я создал начальный файл для тестирования:
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
Любые идеи, почему это происходит?
Я исправил проблему, добавив имя join_table в каждую модель, например:
has_and_belongs_to_many :foo_urls, :join_table => :foo_clips_foo_urls