Ruby on rails 3 — Если затем добавить 1 к переменной, которая позже будет распечатана

#ruby-on-rails #ruby-on-rails-3 #variables #if-statement

#ruby-on-rails #ruby-on-rails-3 #переменные #if-оператор

Вопрос:

Привет, я хочу создать переменную и добавить 1, если утверждение истинно, а затем, после того как я пройдусь по всем операторам, показать общее значение этой переменной.

 <% @variable_with_counts = 0 %>
<% games.each do |game|%>
  <% if game_is_true?(game.id) %>
    <% @variable_with_counts  = 1 %>
  <% end %>
<% end %>

<%= @variable_with_counts %>
  

Это не дает мне общего числа, а только 0 или 1.

Как видите, я новичок…

ОБНОВЛЕНИЕ Странно, теперь, когда я протестировал это снова, это сработало, извините!

Заранее спасибо!

Комментарии:

1. Кажется, вы вкладываете слишком много логики в свой взгляд.

2. согласен с apnea — возможно, вам захочется рассмотреть возможность переноса этой переменной экземпляра в контроллер для лучшего подхода MVC

3. @Will, ИМО, было бы еще лучше сделать это как метод класса в игровой модели, вместо того, чтобы делать это в контроллере. Это позволило бы сделать что-то вроде games.number_of_trues .

4. @mischa очень верно — просто предложил простое решение в качестве быстрого исправления, но если OP может внедрить метод в модель, это было бы идеально

5. Да, я полностью согласен, я применю приведенное ниже решение и сокращу код!

Ответ №1:

Используйте более ооп-подобный и функциональный подход к вашей проблеме, который, в свою очередь, уменьшит логику в представлении. Как насчет этого?

 <%= games.all.count {|game| game_is_true? game.id } %>
  

Чтобы сделать это еще короче, сделайте «game_is_true?» методом вашего класса game:

 class Game << ActiveRecord::Base

  def is_true?
    game_is_true? self.id # or whatever evaluates this
  end

end
  

Таким образом, это получается как:

 <%= games.all.count {|game| game.is_true? } %>
  

В зависимости от вашей версии ActiveRecord, вам может потребоваться заменить «все» на «каждый» или «to_a». Если «game_is_true?» на самом деле вычисляет поля SQL, было бы разумнее превратить его в метод scope с предложением where, чтобы вы могли выполнить «games.is_true.count», что уменьшает накладные расходы SQL.