web-dev-qa-db-ja.com

Rails 4移行:has_and_belongs_to_manyテーブル名

私は現在、Rails 3.2アプリをRails 4.0に切り替えようとしています。しかし、has_and_belongs_manyモデル。

テストアプリを作成しましたが、同じ問題が発生します。これは私がやったことです:

2つのモデルを作成: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と呼ばれています。

なぜこれが起こるのか?

21
patrickS

次のように、すべてのモデルにjoin_table名を追加して問題を修正しました。

has_and_belongs_to_many :foo_urls,  :join_table => :foo_clips_foo_urls
46
patrickS