Rails: «Не удалось найти таблицу» в отношениях многих ко многим - PullRequest
4 голосов
/ 22 апреля 2010

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

Could not find table 'incidents_users'

Похоже, что rails ищет таблицу incidents_users, когда я на самом деле создал таблицу users_incidents. 'users_incidents' просто содержит user_id иident_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 %>

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

1 Ответ

10 голосов
/ 22 апреля 2010

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

Из документации :

Таким образом, соединение между Developer и Project даст имя таблицы соединений по умолчанию "developers_projects", поскольку "D" превосходит "P".Обратите внимание, что этот приоритет вычисляется с использованием оператора <для String.Это означает, что если строки имеют разную длину и строки равны при сравнении до самой короткой длины, то считается, что более длинная строка имеет более высокий лексический приоритет, чем более короткая.Например, можно ожидать, что таблицы «paper_boxes» и «paper» сгенерируют имя таблицы соединений «paper_paper_boxes» из-за длины имени «paper_boxes», но на самом деле генерирует имя таблицы соединений «paper_boxes_papers».</p>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...