У меня есть две таблицы, настроенные в many-many отношениях: Инциденты и Пользователи. Когда пользователь зарегистрирован, и они просматривают / страницу инцидентов (индекс), я хочу отобразить все инциденты, с которыми они связаны. К сожалению, следующая ошибка происходит:
Could not find table 'incidents_users'
Кажется, что направляющие ищут таблицу 'incidents_users', когда я на самом деле составил таблицу 'users_incidents'. users_incidents' просто содержит user_id и incident_id.
Я пропускаю что-то очевидное? Я относительно плохо знаком с направляющими, таким образом, проблемой могло быть что-то простое, которое я пропустил.
Вот соответствующий раздел 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 %>
Спасибо! Сообщите мне, было ли больше информации полезно.
Ваша таблица соединений должна называться incidents_users
, потому что соглашение Rails при использовании ассоциации has_and_belongs_to_many
заключается в том, что имя таблицы является производным из лексического порядка имен классов моделей, составляющих ассоциацию.
Таким образом, объединение между Developer и Project даст имя таблицы соединения по умолчанию "developers_projects" , потому что «D» превосходит «P». Обратите внимание, что этот приоритет рассчитывается с использованием оператора <для String. Это означает , что если строки имеют разную длину и строки равны по сравнению с самой короткой длиной , то более длинной строкой будет { {1}} считается имеющим более высокий лексический приоритет, чем более короткий. Например, можно было бы ожидать, что таблицы "paper_boxes" и "paper" сгенерируют имя объединенной таблицы "paper_paper_boxes" из-за {{ 1}} длина имени "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, если вы не конкретная причина, которая вам мешает.