Я беру значения от пользователя, сохраняю их в объекте как свойства и сохраняю в массиве. Массив состоит из следующего:

[
  #<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_tender и reject_tender. reject_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' после вызова метода accept. Код для метода accept следующий:

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?

0
Moriarty 4 Окт 2018 в 15:50

1 ответ

Лучший ответ

Я нашел ответ на поставленный выше вопрос. Помимо find, можно также использовать метод detect для изменения только первого вхождения экземпляра в массив.

0
Moriarty 5 Окт 2018 в 05:16