#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.