Ассоциации Rails 3.1?

#ruby-on-rails #associations #ruby-on-rails-3.1

#ruby-on-rails #ассоциации #ruby-on-rails-3.1

Вопрос:

У меня есть приложение Rails 3.1.1 со следующими моделями:

 Company
Member
  

Две модели имеют следующие ассоциации:

 Company - has_many :members
Member  - belongs_to :company
  

При добавлении участников я могу ввести идентификационный номер компании, и запись будет успешно связана, я могу искать участников через компанию и т. Д.

Когда я работаю над представлением участника, я хотел бы «вытащить» детали компании.

В настоящее время у меня есть следующее в представлении show:

 <h1>Listing members</h1>

<table>
  <tr>
    <th>Name</th>
    <th>Mobile</th>
    <th>Email</th>
    <th>Qualifications</th>
    <th>Membership</th>
    <th>Company</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @members.each do |member| %>
  <tr>
    <td><%= member.name %></td>
    <td><%= member.mobile %></td>
    <td><%= member.email %></td>
    <td><%= member.qualifications %></td>
    <td><%= member.membership %></td>
    <td><%= @member.company.company_id %></td>
    <td><%= link_to 'Show', member %></td>
    <td><%= link_to 'Edit', edit_member_path(member) %></td>
    <td><%= link_to 'Destroy', member, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
</table>
  

Как мне получить поле от связанной компании? Например, модель компании имеет два поля (широта и долгота).

Комментарии:

1. Есть что-то, чего я здесь не понимаю, не <%= member.company.latitude %> сработает?

2. В результате получается ‘неопределенная локальная переменная или метод `member’ для #<#<Class:0x99cdcc8>:0x99a8a40>’

3. вы поместили это в цикл members ( <%= member.membership %> например, прямо ниже)?

4. @dannymcc StackOverflow предназначен для устранения неполадок или устранения конкретных ошибок. Вы задаете нам несколько очень простых вопросов, на которые можно (и нужно) ответить, прочитав несколько начальных руководств по Rails. Я рекомендую Rails Guides и Railscasts .

5. @dannymcc вы спрашиваете, не попробовав сначала.

Ответ №1:

Ваш цикл должен выглядеть так:

 <% @members.each do |member| %>
  <tr>
    <td><%= member.name %></td>
    <td><%= member.mobile %></td>
    <td><%= member.email %></td>
    <td><%= member.qualifications %></td>
    <td><%= member.membership %></td>
    <td><%= member.company_id %></td>
    <td><%= member.company.latitude %></td>
    <td><%= link_to member.company.name, member.company %></td>
    <td><%= link_to 'Show', member %></td>
    <td><%= link_to 'Edit', edit_member_path(member) %></td>
    <td><%= link_to 'Destroy', member, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
  

company_id определено в Member модели, вы не можете получить к нему доступ member.company.company_id . Чтобы получить доступ к полю в связанной модели компании, используйте member.company.my_field .

Они будут работать только в цикле members, поскольку они обращаются к |member| переменной, которая передается в блок.

Комментарии:

1. Спасибо за объяснение! Сработало отлично. Я не понимаю, почему в ссылке на вас не переносите имя ссылки на «? Это только тогда, когда вам нужны статические элементы? Например; <%= link_to ‘Company’, member.company %>

2. @dannymcc Да, вы все правильно поняли. Вы не ставите кавычки при получении имени ссылки из атрибута модели или переменной, только при передаче жестко закодированной строки.

Ответ №2:

 @member.company.latitude
  

et cetera. Пожалуйста, дайте мне знать, если вам нужны разъяснения или дополнительная информация.

Комментарии:

1. Кажется, я получаю сообщение об ошибке для этой компании ‘undefined method` для nil: NilClass’

2. Это должно быть member , если вы используете его в цикле в вашем примере. И ваша следующая ошибка будет undefined method 'company_id' for Company.... , и для ее решения вам нужно изменить эту строку: @member.company.company_id на что-то другое или удалить ее. Затем прочитайте несколько руководств по Ruby / Rails … это базовый материал.