Rails 3 Subtotaling

时间:2011-11-29 03:04:11

标签: ruby-on-rails-3 activerecord

我仍然是Rails的新手(实际上是开发期)。我正在使用Rails 3。

活动包含以下字段:id,user_id,activity_type(integer)。

在我看来,我想显示用户已完成的每种活动类型的计数,如下所示:

 <%= activity.activity_type %> - [count for activity]

只有,我可以弄明白该怎么做。在我的控制器中,我尝试了不同的东西,如:

@user = current_user

@activity_type_ids = Activity.select("DISTINCT(activity_type_id)")
@activity_type_counts = Activity.where('user_id = ? and activity_type_id = ?', @user.id, @activity_type_ids).count   

@activity_type_counts = Activity.where('user_id = ? and activity_type_id = ?', @user.id, @activity_type_ids).group("activity_type_id").count   

在我看来,我试过了:

<% @activity_type_counts.each do |activity_type_count| %>
  <%= "(#{activity_type_count.activity_type_id}) #{activity_type_count}" %>
<% end %>

<% @activity_type_ids.each do |activity_type_id| %>
  <%= "(#{activity_type_id.activity_type_id}) #{@activity_type_count}" %>
<% end %>

提前感谢您提供任何帮助!


使用模型和控制器进行了更新 修复模型细节

我有三种模式:用户,位置和活动。用户有许多位置。一个地方可以有很多活动。

user.rb

has_many :locations 

location.rb

belongs_to :user
has_many :activities

activities.rb

belongs_to :location 

activity_report_controller

@user = current_user
@locations = @user.locations
@activities = @locations.activities.count(:group => "activity_type_id")

1 个答案:

答案 0 :(得分:1)

我认为你有

class User
  has_many :activities
end

然后你可以说

@user.activities.count(:group => "activity_type_id")

这应返回OrderedHash,其中键为id,值为计数。

<小时/> 更新:事实证明原来的问题是错误的,有一个中介Location

你想要的是有很多用户参与活动

class User
  has_many :locations 
  has_many :activities, :through => :locations
end

class Location
  has_many :activities
end

现在在您的控制器中。

@user = current_user
@activity_counts = @user.activities.count(:group => "activity_type_id")