奇怪的输出| rails每个都在活动记录上循环

时间:2017-07-23 09:58:23

标签: ruby-on-rails activerecord ruby-on-rails-5

在Rails 5中,我通过活动记录关系查询并通过每个循环推送数组中的每个记录。

stats_array = []
pUser = {}

userProject = UserProject.find_by(project_id: params[:projectId], user_id: params[:userId])
if userProject && userProject.project.present?
  projectUsers = userProject.project.users.where(role_id: 1..3).page(params[:page]).per(5) 
  projectUsers && projectUsers.each do |pu|
    pUser[:full_name] = pu.full_name
    pUser[:avatar_url] = pu.avatar.url(:medium)
    pUser[:given] = UserTask.where(to_user: pu.id).joins(:task).count
    pUser[:late] = UserTask.where(to_user: pu.id).joins(:task).where(:tasks => {end_date: Date.today.beginning_of_day..Date.today.end_of_day}).count
    pUser[:wip] = UserTask.where(to_user: pu.id).joins(:task).where(:tasks => {state: @@task_wip_code}).count
    puts "=============================="
    puts pUser # outputs correct details
    puts "=============================="
    stats_array.push(pUser)
  end
end

puts "=============================="
puts stats_array # output wrong details
puts "=============================="
当我打印用户对象pUser时,在循环中

。它打印正确。 为每个不同的用户。

问题是当我打印stats_array时,它会打印出最后一个用户的所有结果。数组长度是正确的,但结果不是。

Out-Each-Do循环

  

========索引0 =======

     

{:full_name =>"超级用户",:avatar_url =>" missing.png",   :given => 14,:late => 0,:wip => 4}

     

========索引1 =======

     

{:full_name =>" Antonio Lingnan",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

     

======== index 2 =======

     

{:full_name =>" Uland Nimblehoof",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

     

========索引3 =======

     

{:full_name =>" kU",:avatar_url =>" missing.png",   :given => 10,:late => 0,:wip => 2}

     

========索引4 =======

     

{:full_name =>" Saadi Orlaf",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

在每个循环之后输出stats_array

  

======== stats_array =======

     

{:full_name =>" Saadi Orlaf",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

     

{:full_name =>" Saadi Orlaf",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

     

{:full_name =>" Saadi Orlaf",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

     

{:full_name =>" Saadi Orlaf",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

     

{:full_name =>" Saadi Orlaf",   :avatar_url =>" missing.png",:given => 11,:late => 0,   :WIP =→2}

1 个答案:

答案 0 :(得分:2)

尝试仅在.each循环内声明pUser。我的猜测是因为你并没有复制你只是将对象的引用推送到数组上的对象,因此它总是会更新到最后一个对象。

stats_array = []

userProject = UserProject.find_by(project_id: params[:projectId], user_id: params[:userId])

if userProject && userProject.project.present?

  projectUsers = userProject.project.users.where(role_id: 1..3).page(params[:page]).per(5) 
  projectUsers && projectUsers.each do |pu|

    pUser = {}
    pUser[:full_name] = pu.full_name
    pUser[:avatar_url] = pu.avatar.url(:medium)
    pUser[:given] = UserTask.where(to_user: pu.id).joins(:task).count
    pUser[:late] = UserTask.where(to_user: pu.id).joins(:task).where(:tasks => {end_date: Date.today.beginning_of_day..Date.today.end_of_day}).count
    pUser[:wip] = UserTask.where(to_user: pu.id).joins(:task).where(:tasks => {state: @@task_wip_code}).count
    puts "=============================="
    puts pUser # outputs correct details
    puts "=============================="
    stats_array.push(pUser)

  end
end