Направляющие: 'Не удалось найти таблицу' в many-many отношениях

У меня есть две таблицы, настроенные в 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 %>

Спасибо! Сообщите мне, было ли больше информации полезно.

5
задан Magicked 22 April 2010 в 13:05
поделиться

1 ответ

Ваша таблица соединений должна называться 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, если вы не конкретная причина, которая вам мешает.

10
ответ дан 13 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: