has_and_belongs_to_many给出"没有这样的表"错误

时间:2011-12-21 08:24:37

标签: ruby-on-rails ruby-on-rails-3.1

我在档案和联系方面有很多关系,因此他们有和___belongs_to_many的关系:

class Dossier < ActiveRecord::Base
  has_and_belongs_to_many :contacts

class Contact < ActiveRecord::Base
  has_and_belongs_to_many :dossiers

在Dossiers控制器展示方法中我有这个:

@dossier = current_user.company.dossiers.find(params[:id])    
@dossier_contacts = @dossier.contacts

但是当我请求节目视图时,我收到错误:

SQLite3::SQLException: no such table: contacts_dossiers: SELECT COUNT(*) FROM "contacts" INNER JOIN "contacts_dossiers" ON "contacts"."id" = "contacts_dossiers"."contact_id" WHERE "contacts_dossiers"."dossier_id" = 1

视图如下所示:

<li><%= I18n.t :dossier_nr_contacts %></li><li><%= @dossier_contacts.count.to_s %></li>

我认为我已经设置了正确的关系,表存在,但我现在不知道它为什么会出错。有线索吗?

编辑:我做过的迁移:

class CreateDossiersContactsJoinTable < ActiveRecord::Migration
  def up
    create_table :dossiers_contacts, :id => false do |t|
      t.integer :dossier_id
      t.integer :contact_id
    end
  end

  def self.down
    drop_table :dossiers_contacts
  end
end

2 个答案:

答案 0 :(得分:18)

您的联接表名称错误。

应为contacts_dossiers(默认为字母顺序)

  

如果创建has_and_belongs_to_many关联,则需要显式创建连接表。除非使用:join_table选项显式指定了连接表的名称,否则Active Record将使用类名的词法顺序创建名称。因此,客户和订单模型之间的连接将提供默认的连接表名称“customers_orders”,因为“c”在词法排序中超出“o”。

来源:http://guides.rubyonrails.org/association_basics.html#creating-join-tables-for-has_and_belongs_to_many-associations

答案 1 :(得分:1)

如果你使用has_and_belongs_to_many,你总是需要一个为你保存id对的关联表。按照惯例,这个表被称为加入两个表的复数!在您的示例中contacts_dossiers

您需要创建此表。创建一个迁移并创建如下表:

create_table :contacts_dossiers, :id => false do |f|
     f.integer :contact_id, :dossier_id
end

然后迁移表格,一切都应该有效!