如何在rails 4中搜索关联

Mur*_*tza 5 ruby ruby-on-rails

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

Profile.rb

has_many :categorizations
has_many :subjects, through: :categorizations
Run Code Online (Sandbox Code Playgroud)

subject.rb中

has_many :categorizations
has_many :profiles, through: :categorizations
Run Code Online (Sandbox Code Playgroud)

Categorization.rb

belongs_to :profile
belongs_to :subject
Run Code Online (Sandbox Code Playgroud)

意见/搜索/ 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 %>
Run Code Online (Sandbox Code Playgroud)

search_controller.rb

def index
  @profiles = Profile.with_translations('en').all
end
Run Code Online (Sandbox Code Playgroud)

Ric*_*eck 4

需要补充的是full text searchingRails 的想法。如果您正在执行搜索,则需要注意您实际上是在数据库中执行全文“搜索”查询,这根据您使用的 SQL 引擎而有所不同


MYSQL 全文搜索

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

SELECT * FROM `products` WHERE `name` LIKE '%alligator%'
Run Code Online (Sandbox Code Playgroud)

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


PostgreSQL 全文搜索

我写这篇文章的原因是因为 PSQL 实际上以不同的方式执行此操作,因此您提供的查询仅适用于 MYSQL。PSQL 有很多不同的函数来处理全文搜索,但由于我们使用 Heroku,我们设法使用Textaulous 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 
Run Code Online (Sandbox Code Playgroud)

正如上面的示例所示,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
Run Code Online (Sandbox Code Playgroud)

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


全文检索软件

全文搜索在数据库上本质上是相当昂贵的,特别是当您有大量数据需要搜索时。这就是为什么存在像sunspot solrsphinx这样的解决方案——提供一种索引和搜索您拥有的数据的方法

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

Heroku 的全文搜索包

  • 没问题!如果您是 Rails 新手,我实际上不会建议您实现“硬核”全文搜索功能(需要一些工作才能使其正常工作)。我想做的是给你一个关于你实际上想要做什么的定义;当您提高技能时,您将拥有一个可以实施的功能集,而不仅仅是获得一个查询:) (2认同)