我有两个以多对多关系设置的表:事件和用户。当用户登录并查看/事件页面(索引)时,我想显示与之关联的所有事件。不幸的是,发生以下错误:
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 %>
谢谢!如果有更多信息有用,请告诉我。
答案 0 :(得分:10)
您的连接表必须被称为incidents_users
,因为使用has_and_belongs_to_many
关联时Rails的约定是表名是从组成模型的模型的类名的词汇顺序派生的。关联。
所以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的惯例,除非你有一个特别的理由阻止你。