2010-04-22 81 views
4

我有两个以多对多关系建立的表格:事件和用户。当用户登录后,他们查看/事件页面(索引),我想要显示与它们关联的所有事件。不幸的是,出现以下错误:Rails:在多对多关系中找不到表格

Could not find table 'incidents_users' 

看来Rails是寻找表“incidents_users”,当我真正创建表“users_incidents”。 'users_incidents'只保存user_id和incident_id。

我失去了一些东西明显?我对rails比较陌生,所以问题可能很简单,我忽略了。

这里是incidents_controller.rb

# GET /incidents 
# GET /incidents.xml 
def index 
    @incidents = current_user.incidents 

    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @incidents } 
    end 
end 

这里的相关部分是index.html.erb

<% for incident in @incidents %> 
    <tr> 
    <td><%=h incident.other_id %></td> 
    <td><%=h incident.title %></td> 
    <td><%= link_to 'Show', [@customer, incident] %></td> 
    <td><%= link_to 'Edit', edit_customer_incident_path(@customer, incident) %></td> 
    <td><%= link_to 'Destroy', [@customer, incident], :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 

感谢有关节!请让我知道,如果更多的信息会有所帮助。

回答

10

您的连接表必须被称为incidents_users,因为Rails使用has_and_belongs_to_many关联时的惯例是表名是从构成关联的模型的类名称的词法顺序派生而来的。

documentation

因此开发人员和项目 会以默认之间的连接加入“developers_projects”的 表名 因为“d”级别高于“P”。请注意, 此优先级是使用 对于String的<运算符计算的。这意味着该 如果字符串不同 长度,并且当相比较高达最短 长度,则较长的字符串是 考虑更高词法 优先比中较短的字符串相等 。对于 例如,人们可能会期望表 “paper_boxes”和“论文”,以产生 联接的 “papers_paper_boxes”表名称,因为 长的名字“paper_boxes”,但 它实际上是产生一个连接表“paper_boxes_papers”的名称 。

注意到,该表名可以指定关联时,所以使用:join_table选项覆盖:

class Incident < ActiveRecord::Base 
    has_and_belongs_to_many :users, :join_table => 'users_incidents' 
end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :incidents, :join_table => 'users_incidents' 
end 

—通常最好只是去与Rails的约定,虽然,除非您已这是阻止你的特殊原因。

+0

那很简单吧?谢谢! :) – Magicked 2010-04-22 13:11:59

+0

哇,谢谢你的更新!我正在慢慢学习如何理解官方API文档。我非常感谢你的帮助。 – Magicked 2010-04-22 13:23:52

+0

没问题:-)不要忘记Rails指南:http://guides.rubyonrails.org/ – 2010-04-22 13:27:33