我目前正在try 将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_和_beans_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_url

知道为什么会这样吗?

推荐答案

我通过将join_表名称添加到每个模型中修复了该问题,如:

has_and_belongs_to_many :foo_urls,  :join_table => :foo_clips_foo_urls

Postgresql相关问答推荐

无法从Docker迁移Golang上的两个不同服务到一个数据库'

Org.postgresql.util.PSQLException:错误:函数LOWER(BYTEA)不存在

是否可以在psql查询输出中删除新行末尾的+号?

使用jOOQ在postgres上取消嵌套enum_range

ST_Intersects 太慢

在 Age Viewer 上看不到 node 的第一个属性

Regexp_replace 行为会改变,如果它用空白字符串或 null 替换字符串数组中的字符串

使用 pgx.CopyFrom 将 csv 数据批量插入到 postgres 数据库中

如何在 postgresql 中创建一个空的 JSON 对象?

全文搜索(Postgres)与Elastic search

UPDATE implies move across partitions

我应该同时指定 INDEX 和 UNIQUE INDEX 吗?

声明变量set = select

Hibernate 启动很慢

将数据推送到 Heroku 时出错:time zone displacement out of range

如果 PostgreSQL count(*) 总是很慢,如何对复杂查询进行分页?

FOR EACH STATEMENT 触发器示例

PostgreSQL regexp_replace() 只保留一个空格

在 PostgreSQL 中使用 CASE 一次影响多个列

PostgreSQL:如何解决numeric field overflow问题