5

我想获取主题名称与搜索关键字匹配的所有个人资料。现在我正在加载所有配置文件。我需要知道如何实现它。任何帮助深表感谢。

简介.rb

has_many :categorizations
has_many :subjects, through: :categorizations

主题.rb

has_many :categorizations
has_many :profiles, through: :categorizations

分类.rb

belongs_to :profile
belongs_to :subject

意见/搜索/index.html.erb

# search form
<%= form_tag search_index_path, :method => 'get' do %>
  <%= text_field_tag :search, params[:search] %>
  <%= submit_tag "search", :name => nil %>
<% end %>

# search results
<% @profiles.each do |profile| %>
  <%= profile.name %>
<% end %>

search_controller.rb

def index
  @profiles = Profile.with_translations('en').all
end
4

3 回答 3

4
@profiles = Subject.where("name LIKE ?", "%#{params[:search]}%").map(&:profiles)
于 2013-10-23T00:18:33.117 回答
4

对此要补充的是full text searching使用 Rails 的想法。如果您正在执行搜索,则需要注意您实际上是在数据库中执行全文“搜索”查询,这取决于您使用的 SQL 引擎


MYSQL全文搜索

LIKE %{search}%机制是 MYSQL 非常基本的全文搜索功能,基本上在您的数据库中的整个记录​​中查找您的目标查询。这意味着如果您的查询是这样的:

SELECT * FROM `products` WHERE `name` LIKE '%alligator%'

MYSQL 基本上会查看整个“名称”记录以查找对您查询的任何引用。结果将取决于您的记录是否有任何部分包含“鳄鱼”一词。这个参考解释了更多关于这个


PostgreSQL 全文搜索

我写这篇文章的原因是因为 PSQL 实际上以不同的方式执行此操作,因此您提供的查询仅适用于 MYSQL。PSQL 有很多不同的函数来处理全文搜索,但由于我们使用 Heroku,我们设法使用Textacular gem来让它正常工作

以下是PSQL 处理全文搜索的一些方法

PostgreSQL 中的全文搜索基于匹配运算符@@,如果 tsvector(文档)与 tsquery(查询)匹配,则返回 true。首先写入哪种数据类型并不重要:

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat &
rat'::tsquery;  ?column?
----------  t

SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat
rat'::tsvector;  ?column?
----------  f 

正如上面的例子所暗示的,一个 tsquery 不仅仅是原始文本,不仅仅是一个 tsvector > 。tsquery 包含搜索词,这些词必须是已经规范化的词位,并且可以使用 AND、OR 和 NOT 运算符组合多个词。(有关详细信息,请参阅第 8.11 节。)有一些函数 to_tsquery 和 plainto_tsquery 有助于将用户编写的文本转换为适当的 tsquery,例如通过规范化文本中出现的单词。类似地,to_tsvector 用于解析和规范化文档字符串。所以在实践中,文本搜索匹配看起来更像这样:

SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');  ?column? 
----------  t Observe that this match would not succeed if written as

SELECT '肥猫吃了肥鼠'::tsvector @@ to_tsquery('fat & rat'); ?柱子? - - - - - F


全文检索软件

全文搜索在数据库上本质上是相当昂贵的,尤其是当您有大量数据要搜索时。这就是存在诸如sunspot solrsphinx之类的解决方案的原因——提供一种索引和搜索您拥有的数据的方法

如果您的应用程序变得非常流行,您可能希望投资于全文搜索系统之一,例如Heroku 演示的这些系统:

Heroku 的全文搜索包

于 2013-10-23T09:05:24.987 回答
2

检查这是否有效。

@profiles = Profile.joins(:subjects).where("subject.name like '%?%'",params[:search])
于 2013-10-23T05:46:30.850 回答