Rails 3需要很长时间才能加载结果

时间:2013-08-22 06:13:42

标签: ruby-on-rails ruby

我的rails应用程序必须通过缺少行的数据库进行查询并显示匹配的结果。我的代码工作得很好,但是它很慢,它需要很长时间来显示结果。我使用ruby 1.9.3和rails 3.2.13和“Webrick”服务器。我确定存在一些问题。有什么方法可以解决这个问题。我有两个叫做坐标和推文的表。

我的控制器代码

require 'will_paginate/array'
class TweetsController<ApplicationController
  def index
    city = params[:show]
    search_term = params[:text]

    search_term.gsub!(/\s/, '%')
    city_coordinates = Coordinates.where('city=?', city)

     if (city_coordinates.count == 1 && city_coordinates.first.valid_location?)
       @tweets = ((Tweets.for_coordinates(city_coordinates.first) &  Tweets.where("tweet_text LIKE?" , "%#{search_term}%"))).paginate(page: params[:page], per_page:5)
     elsif(city_coordinates.count!=1)
       @tweets  =   ((Tweets.for_user_location(city) &  Tweets.where("tweet_text LIKE?" , "%#{search_term}%"))).paginate(page: params[:page], per_page: 5)
     else
       Tweets.where("tweet_text LIKE? ", "%#{search_term}%").paginate(page: params[:page], per_page: 5)
     end
  end
end

我的模型代码

class Tweets<ActiveRecord::Base
  attr_accessible  :id, :tweet_created_at, :tweet_id, :tweet_text, :tweet_source, :user_id, :user_name, :user_sc_name, :user_loc, :user_img, :longitude, :latitude, :place, :country
  def self.for_coordinates(coordinates)
    bbox = { min_lat: coordinates.latitude - 1.0, max_lat: coordinates.latitude + 1.0,
      min_lng: coordinates.longitude - 1.0, max_lng: coordinates.longitude + 1.0
    }
    Tweets.where("(longitude BETWEEN ? and ?) AND (latitude BETWEEN ? and ?) OR (user_loc LIKE ?) " ,
                 bbox[:min_lng], bbox[:max_lng], bbox[:min_lat], bbox[:max_lat], "%#{coordinates.city}%" )
  end

  def self.for_user_location(city)
    @tweets= Tweets.where("user_loc LIKE ?", "%#{city}%")                
  end
end          

我的视图代码

<%= will_paginate @tweets %>
<% @tweets.each do |tweets| %>
<ul>
  <li><%= tweets.id %></li>
  <li><%= tweets.tweet_created_at %></li>

  <li><%= tweets.tweet_source %></li>
  <li><%= tweets.tweet_text %></li>
  <li><%= tweets.user_id %></li>
  <li><%= tweets.user_name %></li>
  <li><%= tweets.user_sc_name %></li>
<li><%= tweets.user_loc %></li>
  <li><%= tweets.user_img %></li>
  <li><%= tweets.longitude %></li>
  <li><%= tweets.latitude %></li>
<li><%= tweets.place %></li>
  <li><%= tweets.country %></li>

<% end %>
</ul>

它有两个搜索框,一个用于推文查询,另一个用于城市,它必须显示特定城市的推文。但它非常慢。我无法找到原因,如果它是由于低效编码或错误选择服务器或其他一些原因。它使用Mysql数据库。

1 个答案:

答案 0 :(得分:1)

您的问题在于两个查询的结合:

@tweets = (
  (
    Tweets.for_coordinates(city_coordinates.first) & 
    Tweets.where("tweet_text LIKE?" , "%#{search_term}%")
  )
).paginate(page: params[:page], per_page:5)

这是做什么的:

  1. 将城市坐标的所有推文检索到内存数组
  2. 将文本与搜索词匹配的所有推文检索到内存数组
  3. 连接1.和2的数组。
  4. 将这些结果分页
  5. 您想要做的是:

    1. 过滤与城市坐标和搜索字词匹配的推文
    2. 分页结果
    3. 检索分页结果
    4. 你会想要更像这样的东西:

      @tweets = Tweets.for_coordinates(city_coordinates.first).
        where('tweet_text like ?', "%#{search_term}%").
        paginate(page:params[:page], per_page:5)