Rails Group_By限制

时间:2012-02-23 23:05:52

标签: ruby-on-rails-3

我正在关注本教程http://railscasts.com/episodes/29-group-by-month

并构建了一个系统,允许用户将联系人分配给特定标签。但是我需要分页,以便它只返回前3个标签,第3个标签等。

如何在ActiveRecord中执行此操作

def index
    @connections = @current_user.user_contacts.where('label_id > 0').order("updated_at")
    @connections_label = @connections.group_by { |t| t.label_id }
end

Contact Table
ID | Name | Label_ID
01 | Mike | 1

Label Table
ID | Name
1  | PSU

已更新

4 个答案:

答案 0 :(得分:4)

您可以尝试take

你用什么分页?如果你想在erb中打印出来,那就是这样的。

<%= @connections.group_by { |t| t.label_id }.take(3).each do |label, connections| %>
  <%= label.name %>
  <% connections.each do |connection|
    <%= connection.name %>
  <% end %>
<% end %>

这会给你前3个标签:

Label 1
 Mike
 ...

Label 2
 Bob
 ...

Label 3
 Jim
 ...

在你的控制器中你应该能够像@VVN那样建议:

.take(3).offset((params[page] || 0) * 3)

答案 1 :(得分:3)

尝试使用

@connections_label = @connections.group("label_id").limit(3).offset((params[page] || 0) * 3)

或者你可以

@connection_labels = @connections.user_contacts.group(:label_id).map(&:label).uniq

@labels_separated_by_3 = []
@connection_labels.each_with_index do |cl, index|
  @labels_separated_by_3[index / 3] ||= []
  @labels_separated_by_3[index / 3] << cl
end

您将获得带有标签的数组。像这样:

1.9.2-p290 :033 > @connection_labels = ['a','a','a','b','b','b','c','c']
1.9.2-p290 :034 > @labels_separated_by_3 = []
 => [] 
1.9.2-p290 :035 > @connection_labels.each_with_index do |cl, index|
1.9.2-p290 :036 >     @labels_separated_by_3[index / 3] ||= []
1.9.2-p290 :037?>     @labels_separated_by_3[index / 3] << cl
1.9.2-p290 :038?> end
 => ["a", "a", "a", "b", "b", "b", "c", "c"] 
1.9.2-p290 :039 > @labels_separated_by_3
 => [["a", "a", "a"], ["b", "b", "b"], ["c", "c"]] 

答案 2 :(得分:1)

如果我不理解你,请告诉我。您正在寻找的是限制器吗?将任务返回限制在过去3个月内到期或创建的任务?

这样的事情:

@tasks = Task.where("created_at > ?", 3.months.ago)
@task_months = @tasks.group_by { |t| t.due_at.beginning_of_month }

这是你的意思吗?

答案 3 :(得分:1)

我认为您正在寻找limit and offset methods,对吧?

@connections_label = @connections.group_by { |t| t.label_id }.limit(3).offset(3)