[英]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
全文搜索軟件
全文搜索本質上在數據庫上非常昂貴,特別是如果您要搜索大量數據。 這就是太陽黑子solr或sphinx等解決方案存在的原因 - 提供一種索引和搜索數據的方法
如果您的應用程序變得非常受歡迎,您可能希望投資其中一個全文搜索系統,例如Heroku演示的這些系統:
檢查是否有效。
@profiles = Profile.joins(:subjects).where("subject.name like '%?%'",params[:search])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.