簡體   English   中英

如何在rails 4中搜索關聯

[英]how to search through associations in rails 4

我希望獲得所有主題名稱與搜索關鍵字匹配的個人資料。 現在我正在加載所有配置文件。 我需要知道如何實現它。 任何幫助深表感謝。

Profile.rb

has_many :categorizations
has_many :subjects, through: :categorizations

subject.rb中

has_many :categorizations
has_many :profiles, through: :categorizations

Categorization.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
@profiles = Subject.where("name LIKE ?", "%#{params[:search]}%").map(&:profiles)

要添加的東西是使用Rails進行full text searching的想法。 如果您正在執行搜索,則需要注意您實際上是在數據庫中執行全文“搜索”查詢,這取決於您使用的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

選擇'胖貓吃肥胖老鼠':: tsvector @@ to_tsquery('fat&rat'); ?柱? - - - - - F


全文搜索軟件

全文搜索本質上在數據庫上非常昂貴,特別是如果您要搜索大量數據。 這就是太陽黑子solrsphinx等解決方案存在的原因 - 提供一種索引和搜索數據的方法

如果您的應用程序變得非常受歡迎,您可能希望投資其中一個全文搜索系統,例如Heroku演示的這些系統:

Heroku的全文搜索包

檢查是否有效。

@profiles = Profile.joins(:subjects).where("subject.name like '%?%'",params[:search])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM