我正在开发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)中提取父母的数据,该如何修改脚本。
非常感谢您!
答案 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
之类的方法。大写定义红宝石中的常量/类。