无法通过 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 %>
我正在通过关联与 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 %>