rails 3精致搜索

时间:2012-03-06 15:55:28

标签: mysql ruby-on-rails search rest cookies

我有一个rails应用程序。主页搜索电影数据库,并在搜索查询的结果页面中显示结果。

现在,在结果页面中有一个电影列表(比如5),结果页面显示左侧栏中电影的属性。

例如,

=================电影结果页面================

左侧杆

流派

喜剧(的link_to) 恐怖(的link_to)

语言

英(的link_to) 德国(的link_to)

结果集

1愤怒管理  2美国馅饼  3邪恶死了  4怨恨  5 Du riescht如此直觉

=============================================== ==

现在,在第一次搜索之后,我的搜索控制器有一个@movieid数组,其中有5个movieids(如上所述)。并且左侧栏有过滤器可以进一步过滤。 使用@movieid数组我在结果集中列出了电影。

如果我点击“喜剧”链接,我希望结果页面只显示“1.愤怒管理”和“2.美国派”。

如果我点击“德语”链接。它应该只显示“5. Du riescht so gut”。多数民众赞成。

现在, 我混淆了以下选项, 我想通过link_to作为参数传递genre_id和@movieid数组。 2.使用cookie [:store]保存@movieid数组 3.将@movieids存储在数据库中并检索。

我不知道如何处理这个问题。请记住,我的@movieid数组也可以包含100000个ID。

帮助我了解最佳做法和表现。

谢谢!

编辑:

我可以使用Mysql Views来存储结果集吗?问题是如果100000用户同时搜索,会创建多少视图会发生什么?,这样可以吗?什么是好的做法?

2 个答案:

答案 0 :(得分:1)

我想,我做得很棒!

回答我的问题:

  1. 从第一个主搜索页面,如果我在电影表上运行搜索查询,并从表中的5000部电影获得300条记录,那么我将从rails方法动态创建mysql数据库中的视图, AR :: Base.connection.execute(),用于保存300部搜索电影的movie_ids。

  2. 现在继续,在第二页中,如果用户根据语言或流派过滤300个结果,我缩小搜索范围,对创建的视图进行搜索,而不是再次搜索MOVIES表。这是通过在将URL传递给link_to帮助程序后从url获取language_id和genre_id来完成的。

  3. 我从每个浏览器中获取一个session_id,并在该id前面附加一个字母,该字母将用作我的视图名称。

  4. 如果用户访问主页或通过搜索页面找到确切的产品,我会放弃我的视图,我会暂停我的视图说1小时,每天我会放弃前一天创建的观点。

  5. 我从Ryan那里得知,坚持用户搜索是一种很好的做法。我也对此感兴趣。现在我想我已经实现了它。请用我的方法中的所有负面信息打我,我试图在这里经营一家公司。

    谢谢!

    编辑:

    忘了我对Ashitaka的感激之情。 当然我添加了will_paginate gem。它工作正常。

    提示:在will_paginate中,如果您要列出83部电影:per_page => 10,那么你将无法在9页的第一页(10 + 10 + .... + 3)中显示电影总数。如果你想像电影一样(83)。然后,@ movies.total_entries.to_s帮忙。

    也谢谢你!

答案 1 :(得分:0)

由于您可以拥有100000部不同的电影,因此您需要在rails应用中实现分页。使用will_paginate gem可以轻松完成此操作。这是一个例子:

# movies_controller.rb
def index
  @movies = Movie.search(params[:q]).order('name').paginate(:page => params[:page], :per_page => 15)

  respond_to do |format|
    format.html
  end
end

然后在你看来:

# index.html.erb
<%= form_tag movies_path, :method => 'get' do %>
  <div>
    <%= text_field_tag :q, params[:q] %>
    <%= submit_tag "Search", :name => nil %>
  </div>
<% end %>
<table>
  <tr>
    <th>Movies</th>
  </tr>
  <% @movies.each do |movie| %>
    <tr>
      <td><%= link_to movie.name, movie %></td>
    </tr>
  <% end %>
</table>
<%= will_paginate @movies %>

搜索和过滤绝对是一个棘手的问题。很难详细解释这么复杂的事情,所以我会简单地指出令人难以置信的Railscast,它解释了如何做你想做的事。

http://railscasts.com/episodes/240-search-sort-paginate-with-ajax