Joh*_*ohn 4 ruby-on-rails ruby-on-rails-3.1
我在档案和联系之间有很多关系,因此他们有以下关系:
class Dossier < ActiveRecord::Base
has_and_belongs_to_many :contacts
Run Code Online (Sandbox Code Playgroud)
和
class Contact < ActiveRecord::Base
has_and_belongs_to_many :dossiers
Run Code Online (Sandbox Code Playgroud)
在Dossiers控制器显示方法中我有这个:
@dossier = current_user.company.dossiers.find(params[:id])
@dossier_contacts = @dossier.contacts
Run Code Online (Sandbox Code Playgroud)
但是当我请求显示视图时,我收到错误:
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
Run Code Online (Sandbox Code Playgroud)
该视图如下所示:
<li><%= I18n.t :dossier_nr_contacts %></li><li><%= @dossier_contacts.count.to_s %></li>
Run Code Online (Sandbox Code Playgroud)
我认为我已经设置了正确的关系,表存在,但我现在不知道为什么它会给出错误.有线索吗?
编辑:我做的迁移:
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
Run Code Online (Sandbox Code Playgroud)
Dam*_*ien 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
| 归档时间: |
|
| 查看次数: |
4124 次 |
| 最近记录: |