Ruby on Rails用户总积分

时间:2012-10-03 07:28:34

标签: ruby-on-rails-3.2

我有两个模型,我试图在索引视图中显示用户的告知信用。

class User < ActiveRecord::Base
has_many  :credits



class Credit < ActiveRecord::Base
belongs_to :user

我试图在index.html.erb视图中显示用户的总积分。我创建了一个帮助方法。

module UsersHelper

 def designer_owed
    designer_owed = Credit.where( :user_id => @user ).sum(:total_received)
  end

我得到的结果有点令人困惑,我知道我做错了但我无法理解。

index.html.erb

<%= h number_to_currency(designer_owed, :unit => "$") %> 

我得到零。

但在我的 show.html.erb

&lt;%= h number_to_currency(designer_owed,:unit =&gt;“$”)%&gt;

我得到了正确的总数。当我使用index.html.erb

查询时,我的sql看起来像这样
SELECT SUM("credits"."total_received") AS sum_id FROM "credits" WHERE "credits"."user_id" IS NULL

我想在索引视图中显示这个。

2 个答案:

答案 0 :(得分:1)

在视图中,像'@user'这样的实例变量对应于控制器中的实例变量。

在索引控制器和相应的视图中,通常会有一个包含所有用户的“@users”实例变量。实际上,在许多情况下,索引操作可以简单如下:

def index
  @users = User.all
end

在任何情况下,在索引中都有一个@user变量是不常见的 - 而且似乎你没有,因此你得到的错误。

在索引视图中,我想你想要遍历所有用户并显示每个用户的欠款,所以:

<%= h @users.each {|user| number_to_currency(designer_owed(user), :unit => "$") %>

我的erb有些生疏,因为我现在已经使用Haml多年了,但我认为这应该有效。您需要更改它以满足您的布局需求。

您的帮助方法现在接受用户参数:

def designer_owed(user)
  Credit.where( :user => user ).sum(:total_received)
end

答案 1 :(得分:1)

def index
  @users = User.includes(:credits) #fires 2 queries. for users and for credits. use for code optimization
end

在视图中,执行

%table
  %thead
    %tr 
      %th User
      %th Credits
  %tbody
    - @users.each do |user|
      %tr
        %td user.name
        %td user.credits.collect(&:total_recieved).sum #doesnt fire extra query cause we have used 'includes'

结帐http://guides.rubyonrails.org/active_record_querying.html