2015-06-13 3 views
0

Я пытаюсь пропустить своих пользователей и суммировать атрибут act_points из связанного post_activites, а затем назначить и сохранить его в атрибуте table моих пользователей total_points. Код ниже работает для меня, но он не следует DRY.DRY ruby ​​on rails loops

<% @users.order("total_points desc").each do |u| %> 
    <p><% u.total_points = u.post_activities.sum(:act_points).round(2) %> </p> 
    <% u.total_points %> 
    <% u.save %> 
<%end%> 
<% @users.order("total_points desc").each do |u| %> 
    <p><% u.total_points = u.post_activities.sum(:act_points).round(2) %> </p> 
    <%= u.total_points %> 
<%end%> 

Любые предложения по объединению этих циклов или их сокращению?

+9

Моя первая реакция после прочтения кода - почему вы называете сохранить в представлении ?! Это огромный NO-NO. – BroiSatse

+0

Я знаю, что это не в производстве, и снова я супер новичок в этом, и это было единственное, что я мог подумать простить меня ... Lol –

ответ

3

Вы можете refactore свой код таким образом:

# user.rb 
def actual_points 
    post_activities.sum(:act_points).round(2) 
end 

def update_total_points 
    update(total_points: actual_points) 
end 

# in controller (change index to your method) 
def index 
    @users = User.order("total_points desc") 
    @users.find_each do |user| 
    user.update_total_points 
    end 
end 

# view 
<% @users.each do |u| %> 
    <%= u.total_points %> 
<%end%> 
+0

спасибо, вы не представляете, насколько это помогло мне узнать об этом вопросе и так много других проблем, с которыми я был благодарен –

+0

@SherwynCooper Добро пожаловать! – hedgesky