Rails:'无法在多对多关系中找到表'

时间:2010-04-22 13:05:06

标签: ruby-on-rails

我有两个以多对多关系设置的表:事件和用户。当用户登录并查看/事件页面(索引)时,我想显示与之关联的所有事件。不幸的是,发生以下错误:

Could not find table 'incidents_users'

当我实际创建表'users_incidents'时,看起来rails正在寻找表'incidents_users'。 '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 %>

谢谢!如果有更多信息有用,请告诉我。

1 个答案:

答案 0 :(得分:10)

您的连接表必须被称为incidents_users,因为使用has_and_belongs_to_many关联时Rails的约定是表名是从组成模型的模型的类名的词汇顺序派生的。关联。

来自documentation

  

所以Developer和。之间的联接   Project将提供默认连接   表名称“developers_projects”   因为“D”高于“P”。注意   此优先级使用计算   &lt; 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的惯例,除非你有一个特别的理由阻止你。