Ransack,搜索多列中的一个字段,在Rails 3中。

11

我是Ruby on Rails的新手,正在创建我的第一个网站。我有一个用户模型,其中有3列: firstname(名字),lastname(姓氏)和email(电子邮件)。我正在使用Ransack制作搜索引擎,并希望有一个搜索字段,可以遍历每一列并显示结果。

我制作了一个看起来像这样的user_controller.rb

@q = User.search(params[:q])
@users = @q.result(:distinct => true)

我的 User\index.html.erb 看起来像这样:

<%= search_form_for @search do |f| %>
  <div class="field">
    <%= f.label :firstname_cont , "Firstname" %>
    <%= f.text_field :firstname_cont %>
    <%= f.label :lastname_cont , "Lastname" %>
    <%= f.text_field :lastname_cont %>
    <%= f.label :email_cont , "Email" %>
    <%= f.text_field :email_cont %>
  </div>
  <div class="actions"><%= f.submit "Search" %></div>
<% end %>

给了我3个搜索字段,但我只想要一个可以通过名字、姓氏和电子邮件进行搜索的字段。

编辑1: 经过测试,我发现搜索栏无法处理名字和姓氏,或任何空格。我已经阅读到可以像这样制作帮助方法: 使用Ransack搜索多个字段

当我获得搜索结果时,我被抛入模型索引等:用户/索引。我在哪里可以更改这个?

但是没有关于如何在视图中使用它的信息。为什么很难直接说明,这就是你需要做的:在控制器中这样做->在模型中这样做->在视图中这样做->并且别忘了像这样修复路由->

1个回答

25
首先,在提问之前请尽量查阅一下宝石文档并进行谷歌搜索。 ^_^
首先要参考的是 github 页面:https://github.com/ernie/ransack 查看 Ransack 的演示页面:http://ransack-demo.herokuapp.com/,你应该能看到第一个字段做了你想要的事情(在名和姓中进行搜索),并且查看页面源代码,你应该会看到这一行。
<input id="q_first_name_or_last_name_cont" name="q[first_name_or_last_name_cont]" size="30" type="text" />

这可以帮助您了解要使用的正确谓词,您还可以在此处获得它们的列表:https://github.com/ernie/ransack/blob/master/lib/ransack/constants.rb(始终在Github上的gem文档中)。

根据此,您可以在视图中执行类似以下的操作

<%= f.text_field :lastname_or_first_name_or_email_cont, :placeholder => 'full name or email contains' %>

生成一个“OR条件”查询,如您再次在演示页面中看到的那样(生成的查询显示为传统的SQL查询)。

希望这可以帮助。

干杯


我能再请你帮个忙吗?我注意到空格或者搜索多于一个单词会导致这个方法失败。比如,如果名字是Foo,姓氏是Bar,我搜索Foo bar,它就会失败。是否可以建立一个:def set_full_name .... end,然后在视图中调用它?如何在视图中调用它?使用helper_method吗?我没能做到这一点。最后一个问题,如果我在任何其他地方搜索,我的结果总是会跳转到模型-索引。为什么会这样? - Remi Champ
4
嗨Remi,我遇到了在搜索框中使用多个词进行搜索的问题,目前还没有找到答案。你可以使用ransacker构建一个“虚拟列”进行搜索,在这里有一个例子https://github.com/ernie/ransack_demo/blob/master/app/models/user.rb。关于你问题的第二部分,结果总是将你带到模型索引,因为在你控制器的“搜索”操作中呈现了“索引”视图。祝好。 - phron
好的,谢谢!我会仔细看一下那个演示。我还在自学RoR,并在网上搜寻信息。 - Remi Champ
3
如果我想搜索姓氏(string)或者ID(integer),该怎么办? - Leo
1
@Leo - 你为什么想要搜索ID?从用户的角度来看,ID通常应该保持不可见... - nktokyo
顺便问一下,你是否可以要求结果按某种相关性排序?例如:在这种情况下,首先是与“firstname”匹配的结果,然后是“lastname”? - Christian Benseler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接