2012-02-23 6 views
3

Я следую этой обучающей программы http://railscasts.com/episodes/29-group-by-monthRails Group_By Limit

и создали систему, позволяющую пользователю назначить контакт с определенной меткой. Однако мне нужно пагинацию таким образом, что он возвращает только первые 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

Вы можете попробовать 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) 
+0

именно то, что я хотел. Спасибо. –

1

Позвольте мне знать, если я не понимаю вас правильно. Кажется, что вы ищете лимитер? Ограничение задач, возвращенных на счет или создание в течение последних 3 месяцев?

Что-то вроде этого:

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

Это то, что вы имеете в виду?

+0

в этом случае, что бы 100% Работа. Я на самом деле упростил проблему для этой публикации, думая, что ее будет легче связать. Я обновил свой вопрос до моей точной проблемы –

1

Я думаю, что вы ищете limit and offset methods, не так ли?

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

, что, по сути, я пытаюсь сделать. Однако я получаю «неопределенный метод' limit »при попытке этого –

+0

@MikeSilvis вы используете рельсы 3? – alf

+0

Да, я использую рельсы 3 –

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"]] 
Смежные вопросы