无法通过 rails 4 视图中的关联设置 if else 条件与 has-many

unable to set if else conditions with has-many through association in rails 4 view

我正在通过关联与 has_many 一起开发应用程序。 在 employee.rb

class Employee < ActiveRecord::Base
 has_many :inventories, through: :employee_inventories
end

inventory.rb

class Inventory < ActiveRecord::Base
  has_many :employees, through: :employee_inventories
end

employee_inventories.rb

class EmployeeInventory < ActiveRecord::Base
  belongs_to :employee
  belongs_to :inventory
end

这个协会一切都很好。但是当我通过从 employee_inventory 访问状态列来实现 if-elsif 条件时。那样

<% if (inventory.is_available == false && current_employee[:role] == 'INVENTORY') %>
     <% if(inventory.employee_inventories.collect{|e| e.status == 'REQUESTED'}) %>
           <%= link_to 'Allot', inventory_available_status_inventory_path(inventory,   :employee_inventory => { :status => 'ALLOTTED' }) %>
            <%= link_to 'Cancel', inventory_available_status_inventory_path(inventory, :employee_inventory => { :status => 'CANCELLED' } ) %>
     <% elsif (inventory.employee_inventories.collect{|e| e.status == 'ALLOTTED'}) %> 
            <%= link_to 'return'%>
      <% end %>
<% elsif inventory.is_available == true %>
     <%= link_to 'Request for inventory',request_inventories_inventory_path(inventory, :employee_inventory => { :employee_id => current_employee, :status => 'REQUESTED', :inventory_id => inventory}) %>
<% end %>

在将 employee_inventory 的状态更新为已请求时的代码中。一切顺利,但在我将状态更新为 ALLOTTED 之后,第二个 elsif 条件无法执行。

来自 inventory.employee_inventories.collect{|e| e.status == 'ALLOTTED'} 输出:-

[true]

我很困惑为什么第二次没有执行。请指导我。提前致谢。

collect 创建一个包含块返回值的新数组。你有一个 employee_inventories 的状态为 'ALLOTTED',因为你在 collect 块中检查它:e.status == 'ALLOTTED' #=> true,它创建一个布尔数组 true 值:[true].

要解决您的问题,您可以这样做:

inventory.employee_inventories.collect{|e| e.status }.include? 'ALLOTTED'

或根据您的要求使用 any? or all? 检查是否已将任何一名员工库存设置为已分配(如果这就是您在此处所做的):

inventory.employee_inventories.any?{|e| e.status == 'ALLOTTED' }
# or
inventory.employee_inventories.all?{|e| e.status == 'ALLOTTED' }

现在,我建议您将逻辑清理成这样。你真的不需要遵循这个,因为你的问题已经在上面得到了回答:

<% if inventory.is_available? %>
  <%= link_to 'Request for inventory',request_inventories_inventory_path(inventory, :employee_inventory => { :employee_id => current_employee, :status => 'REQUESTED', :inventory_id => inventory}) %>
<% elsif current_employee[:role] == 'INVENTORY' %>
  <% if inventory.employee_inventories.all?{|e| e.status == 'REQUESTED'} %>
    <%= link_to 'Allot', inventory_available_status_inventory_path(inventory,   :employee_inventory => { :status => 'ALLOTTED' }) %>
    <%= link_to 'Cancel', inventory_available_status_inventory_path(inventory, :employee_inventory => { :status => 'CANCELLED' } ) %>
  <% elsif inventory.employee_inventories.all?{|e| e.status == 'ALLOTTED'} %> 
    <%= link_to 'return'%>
  <% end %>
<% end %>