所属表的Ruby on Rails Access列

时间:2019-03-29 02:40:50

标签: ruby-on-rails-4

我正在开发CRUD,我有三个表客户端,audit_cases和ra_cases。

以下是我的模特的关系

rdd.foreach(a -> { API.post(a)}

型号

    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

但是以下脚本对nil:NilClass的未定义方法“ Client_name”存在错误

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

如果使用的话,我可以获得客户端数组'Client:0x007ff7d662adb0'

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

我想知道如果我想从子(audit_cases)而不是从孙子(ra_cases)中提取父母的数据,该如何修改脚本。

非常感谢您!

2 个答案:

答案 0 :(得分:0)

由于“ client.Client_name”列为零, 在添加此代码“除非a_case.client.nil?”后它可以工作

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

答案 1 :(得分:0)

似乎每个关系都不是必需的,因此数据库中可能有一些AuditCase条记录没有与之关联的Client条记录(或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>

让我知道是否可行。

从红宝石样式的角度来看,我会避免使用大写的Client_name之类的方法。大写定义红宝石中的常量/类。