2010-04-22 3 views
4

У меня есть две таблицы, созданные в отношениях «многие ко многим»: инциденты и пользователи. Когда пользователь вошел в систему и просматривает страницу/инциденты (индекс), я хочу показать все инциденты, с которыми они связаны. К сожалению, возникает следующая ошибка:Rails: «Не удалось найти таблицу» в отношениях «многие ко многим»

Could not find table 'incidents_users' 

кажется рельсы ищут таблицу «incidents_users», когда я на самом деле создал таблицу «users_incidents». «users_incidents» просто содержит user_id и event_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 %> 

Спасибо! Пожалуйста, дайте мне знать, если будет полезной дополнительная информация.

ответ

10

Таблица соединений должна быть вызвана incidents_users, поскольку соглашение Rails при использовании ассоциации has_and_belongs_to_many состоит в том, что имя таблицы получается из лексического порядка имен классов моделей, которые содержат ассоциацию

От documentation:

Так соединение между Разработчиком и проекта даст по умолчанию присоединиться имя таблицы из «developers_projects» потому, что «D» званию «P». Обратите внимание, что этот приоритет рассчитывается с использованием оператора < для строки. Это означает, что если строки имеют разную длины, а строки равны при сравнении до самой короткой длины, то строки больше считается более высокого лексических приоритета, чем короче один. Для Например, можно было бы ожидать, таблицы «paper_boxes» и «документы», чтобы генерировать объединение имени таблицы из «papers_paper_boxes» из-за длинами имени «paper_boxes», но он в самом деле генерирует таблицы объединения name из "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 

— Это как правило, лучше всего пойти с конвенциями рельсов, хотя, если вы не имеете особая причина, которая мешает вам.

+0

Это просто, да? Благодаря! :) – Magicked

+0

Вау, спасибо за обновление! Я медленно изучаю, как понимать официальную документацию API. Я действительно ценю твою помощь. – Magicked

+0

Нет проблем :-) Не забудьте также Rails Guides: http://guides.rubyonrails.org/ –