我正在关注本教程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
已更新
答案 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)