I want to Use each block only a certain # of times

I'm a newb with a simple question I have been researching everywhere

I have a block <% @current_user.calls.each do |c| %
                       <%= link_to c.name, etc,blah blah blah -%>
                     <& end %>

and it does this for all the current_user_calls I have but I want to
only show the last 5
Thery are laready in the order I want so is there a way to tell the
each to only do it 5 times

Any help will be appreciated

You can't. You can however give each an array with the correct number of elements, eg
@current_user.calls[0,5].each ...

If .calls is an activerecord associations then that's not a great idea because you're loading all of them, only to discard all but the first 5.

current_user.calls.find :all, :limit => 5

will only load 5 calls etc...

Fred

@current_user.calls.first(5).each do |c|
or
   @current_user.calls.last(5).each do |c|

depending on which order they are already in compared to what you want to see.

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

Frederick Cheung wrote:

If .calls is an activerecord associations then that's not a great idea
because you're loading all of them, only to discard all but the first 5.

current_user.calls.find :all, :limit => 5

will only load 5 calls etc...

Fred

except you can't eager load associations with a limit...
so if it weren't just for current user,
but, instead;

@all_users.each do |user|
  user.calls.last(5).each do |call|
    ...
  end
end

or

@all_users.each do |user|
  user.calls.find(:all, :limit => 5, :order => "id DESC").each do |call|
    ...
  end
end

I'd go for the former
I guess it's a toss up between eager-loading too much, and doing too
many smaller queries...

Matthew Rudy
http://www.workingwithrails.com/person/12394-matthew-rudy-jacobs

Thanks much Fredrick but I'm not sure what to do with the code
What I have is the followint

<% if @current_user.calls.blank? %>
        <h3>You have no calls</h3>
        <ul>
          <li><%= link_to 'Add a call to get started!', { :controller =>
"calls", :action => "new" } %></li>
        </ul>
    <% else %>
      <h3>My Recent Calls</h3>
      <ul>
      <% @current_user.calls.each do |c| %>
          <li><%= link_to c.name, {:controller => "calls", :action =>
'show', :id => c.id} -%></li>
      <% end %>
      </ul>
    <% end %>

So what gets shown in the view is a link to each call by name but it
lists all the calls and I only want 5 to show
The links work and go to the show action for the calls fine. So I am
not sure how to limit the number of calls shown
Any hlp will be appreciated - maybe I need a different loop. The
calls all have call.id's not in order because different users
createcalls but
I handle the associations fine

THEBIGO wrote:

Thanks much Fredrick but I'm not sure what to do with the code

So what gets shown in the view is a link to each call by name but it
lists all the calls and I only want 5 to show
The links work and go to the show action for the calls fine. So I am
not sure how to limit the number of calls shown
Any hlp will be appreciated - maybe I need a different loop. The
calls all have call.id's not in order because different users
createcalls but
I handle the associations fine

well do exactly what Frhodri suggested;

<% recent_calls = current_user.calls.find(:all, :limit => 5, :order =>
"id DESC") %>
<% if recent_calls.blank? %>
  <h3>You have no calls</h3>
  <ul>
    <li><%= link_to 'Add a call to get started!', { :controller =>
"calls", :action => "new" } %></li>
  </ul>
<% else %>
  <h3>My Recent Calls</h3>
  <ul>
    <% recent_calls.each do |call| %>
      <li><%= link_to call.name, {:controller => "calls", :action =>
'show', :id => call.id} -%></li>
    <% end %>
  </ul>
<% end %>

EASY!

Rob I think this works and will try some more much thanks for all your
help and for everyones help
This is a great group

Please don’t use finds, let alone finds with SQL, in views. Hide all that behind a well-named method on your Call model, create an extension named “recent” on your has_many :calls association on User or use named_scope (in Rails 2.1.x), and let your controller set up the data for the view. Since it looks like you might be using Rails 1.2.x, try something like this.

class Call < ActiveRecord::Base

def self.find_recent
find(:all, :limit => 5, :order => “id DESC”)
end

end

class User < ActiveRecord::Base

has_many :calls

end

class WhateverController < …

def whatever_action_is_being_used_in_your_example
@recent_calls = current_user.calls.find_recent
end

end

in your view

<%- if @recent_calls.blank? -%>

You have no calls

... <%- else -%>

My Recent Calls

    <%- @recent_calls.each do |c| -%>

  • <%= link_to [c.name](http://c.name/), {:controller => "calls", :action => 'show', :id => [c.id](http://c.id/)} %>
  • <%- end -%>

<%- end -%>

An approach like this keeps everything in its place in the MVC structure that Rails provides. If you’d like to explore using the association extension or named_scope, let the list know.

Regards,
Craig

Thanks again all and thanks Craig

Actually I do all my finds in the user controller. I had also done
something with the user.rb file which I now see should have been in
the
calls.rb file so I will try that again. right now the suggestion by
Rob is working great so I appreciate all the lessons and input

Owen