仅更改数组中第一个匹配对象的值

时间:2018-10-04 12:50:50

标签: arrays ruby object

我从用户处获取值,将其作为属性存储在对象中,并将其存储在数组中。该数组包含以下内容:

[
  #<Tender:0x0000000001edc870 @company_name="a", @cost=20, @note="dfgv", @rejection_reason="", @status="open">,
  #<Tender:0x0000000001edb088 @company_name="b", @cost=15, @note="dfg", @rejection_reason="", @status="open">
]

我有两种方法:accept_tenderreject_tenderreject_tender'rejected'存储在@status中。 accept_tender'accepted'存储在@status中。输出将是这样的:

Companies     Cost       Status      Reason for rejection 
AA            240000     rejected      cost is high 
BB            200000     accepted       
CC            230000     closed  

一旦调用'closed'方法,第三个状态将更改为acceptaccept方法的代码如下:

def accept_tender
  project_data = find_project
  if project_data.nil?
    puts 'No such project'
  else
    minimum_cost = @tender_management.tenders.map { |tender| tender.cost }.min
    company_data = @tender_management.tenders.map { |tender| [tender.company_name, tender.cost] }.flatten!
    company_name = company_data [company_data.index(minimum_cost) - 1]
    puts "Selected tender is of cost #{minimum_cost} of company #{company_name}"
    update_status
    Menu.show_menu(self)
  end
end

def update_status
  @tender_management.tenders.find { |tender|
    tender.status = 'accepted' if tender.status == 'open'
  }
  @tender_management.tenders.find { |tender|
    tender.status = 'closed' if tender.status == 'open'
  }
end

我使用了find方法来找到第一个状态为'open',然后将其更改为'accepted'。完成此操作后,所有剩余的'open'状态应更改为'closed'。除了使用find以外,还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

我找到了上述问题的答案。除了find之外,还可以使用detect方法仅更改实例在数组中的首次出现。