Столбец Ruby on Rails Access из таблицы принадлежащих - PullRequest
1 голос
/ 29 марта 2019

Я разрабатываю CRUD, и у меня есть три клиента таблиц: aud_cases и ra_cases.

Ниже приведены отношения моих моделей

    class Client < ActiveRecord::Base
        has_many :audit_cases
    end


    class AuditCase < ActiveRecord::Base
            belongs_to :client
            has_many :ra_cases                
    end

    class RaCase < ActiveRecord::Base
        belongs_to :audit_case 
    end

Модель

def index
    @a_cases = AuditCase.all
    @b_cases = RaCase.all
end

Я пытаюсь объединить эти три таблицы и показать их в представлении. Следующий скрипт успешно работает

    <tbody>
     <% @b_cases.each do |b_case| %>
      <tr>
       <td><%= b_case.audit_case.client.Client_name %></td>
       </tr>
     <% end %>
    </tbody> 

Но в следующем скрипте есть ошибка неопределенного метода Client_name для nil: NilClass

    <tbody>
     <% @a_cases.each do |a_case| %>
      <tr>
       <td><%= a_case.client.Client_name %></td>
       </tr>
     <% end %>
    </tbody> 

Я могу получить клиентский массив 'Client: 0x007ff7d662adb0', если я использую

    <%= a_case.client %>

Я хотел бы знать, как я могу изменить свой скрипт, если я хочу извлечь данные родителя изребенок (audit_cases) вместо внука (ra_cases).

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Не похоже, что каждое отношение является обязательным, поэтому в вашей базе данных может быть несколько AuditCase записей, с которыми не связано Client записей (или запись клиента была уничтожена). Следствием этого является то, что ваше представление вызовет ошибку, потому что оно пытается вызвать метод на nil.

Чтобы заставить представление работать, я бы каким-то образом оберегал его. Если вы хотите применить требование к отношениям между клиентом и клиентом, это другая проблема.

Вот несколько возможных идей ноль гвардейцев:

# If you're using Ruby 2.3+, you can use the Safe Navigation Operator
<tbody>
 <% @a_cases.each do |a_case| %>
  <tr>
   <td><%= a_case.client&.Client_name %></td>
   </tr>
 <% end %>
</tbody>

# Rails also provides a #try method
<tbody>
 <% @a_cases.each do |a_case| %>
  <tr>
   <td><%= a_case.client.try(:Client_name) %></td>
   </tr>
 <% end %>
</tbody>

# or just a rough nil check
<tbody>
 <% @a_cases.each do |a_case| %>
  <tr>
   <td><%= a_case.client.Client_name if a_case.client %></td>
   </tr>
 <% end %>
</tbody>

Дайте мне знать, если это работает.

С точки зрения стиля ruby, я бы избегал использования таких заглавных букв, как Client_name. Капитализация определяет константу / класс в ruby.

0 голосов
/ 29 марта 2019

Из-за того, что некоторые столбцы «client.Client_name» равны нулю, он работает после добавления этого кода «разве что a_case.client.nil?»

<%= a_case.client.Client_name unless a_case.client.nil? %>
...