I have a table of several thousand rows and I experimented with these
two method to display them:
In this first method, I just put the follow in the view, let’s call
the view, display.rhtml
<% for x in Cookbook.find(:all) %>
<%= x.recipe %>
<% end %>
The page displays all 5000 recipes in less than 2 seconds. I am quite
happy with it.
The second method, I put the find() business in the controller within
a render :update do |page|.
def showrecipe
render :update do |page|
page.replace_html ‘displaydiv’, :partial => ‘recipe’, :collection
=> find(:all, conditions => [“cuisine = ?”, “italian”])
end
end
This method, when called, takes forever.
----> Can anyone be kind enough to hint why this is the case? <–
The page displays all 5000 recipes in less than 2 seconds. I am quite
end
This method, when called, takes forever.
----> Can anyone be kind enough to hint why this is the case? ←
Thank You!
Hmm… no index on the cuisine column? (I’m assuming that you
really have :conditions as the : seems to be misssing.)
Also, do you really want to push that much data back with rjs? If
all you need is to update a div, use the :update option on your
link_to_remote.
You also don’t say where the “forever” is taking place, for example,
what does the log file contain? (I don’t actually believe you since
I’m never personally waited that long
and in the controller:
def showingredients
render :update do |page|
page.replace_html ‘targetdiv’, :partial => ‘i’, :collection =>
Recipes.find(:all)
end
end
And in the partial ‘i’:
<%= i.ingredients %>
So that’s all. The slow version takes as much as 14 seconds sometimes.
So, are you saying that when you render the 5000 recipes using an
ordinary browser request it’s fast, but when you try to use AJAX to
update the page with 5000 recipes it’s much slower?
Doesn’t that seem sensible? The AJAX response for stuff like
page.replace_html will be escaped so that it can be evaluated by
javascript (so it will be a larger over-the-wire transfer) and the
javascript engine will have to process the response…
Sounds to me like the solution is staring you in the face - don’t use
AJAX in the situations where it’s faster to just render the whole page.
So that’s all. The slow version takes as much as 14 seconds sometimes.
Any ideas?
Have you looked at this with Firefox and Firebug? You should be able
to see how long the request takes. Then I’d see what changing to:
def showingredients
render :update do |page|
page.replace_html ‘targetdiv’, :partial => ‘i’, :collection =>
Recipes.find(:all, :limit => 10)
end
end
does to the timing.
Actually, do you even get the right result after you wait for it?
You have :update => “targetdiv”, but then you’re sending the
javascript to do the replace. If you want to keep the :update,
change the controller to be just:
two method to display them:
The second method, I put the find() business in the controller
all you need is to update a div, use the :update option on your
link_to_remote.
You also don’t say where the “forever” is taking place, for example,
what does the log file contain? (I don’t actually believe you since
I’m never personally waited that long
I totally agree with you. Okay, here’s what I REALLY want to do, I
have for instance, Chinese food, Italian food, and etc, right, these
are menus on the left hand panel if you can imagine, and on the right-
hand side is this targetdiv that will contain all the recipes when the
“XYZ food” button is clicked. So I do want to make the targetdiv a
rather dynamic thing, you know what I mean? I tried this RJS business.
It failed (to achieve the speed) and I beat my brains out to try to
speed it up.
I guess I should just load all on the page and hide them until
toggled?