2010-07-21 133 views

回答

8

在某些情況下,Sql like可能非常低效,例如in many cases in MySQL。我建議使用一些全文索引軟件,如Sphinx,Xapian或Lucene。

+0

所以Active Record中沒有辦法搜索對於每個表和它們的列中的一個字符串? – 2010-08-08 04:23:53

+0

在所有表中搜索可以使用這樣的原始查詢執行:'SELECT'table1'AS table_name,id FROM table1 WHERE c1 LIKE「%text%」or c2 LIKE「%text%」UNION ALL SELECT'table2'AS table_name, id FROM table2 WHERE c3 LIKE「%text%」',但我不會這麼做,這是完全尷尬的。如果您使用MySQL,它具有一些全文索引功能 - http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html - 但我不知道它有多好。我不知道其他關係數據庫中的全文搜索支持。簡述 - AR不會幫助,如果可以的話,請使用全文索引軟件。 – skalee 2010-08-08 11:27:14

+0

剛剛發現一秒前,它可能會幫助你http://snowgiraffe.com/rdocs/ar-extensions/classes/ActiveRecord/Base.html – skalee 2010-08-08 11:33:02

11
Model.find(:all, :conditions => ['name LIKE ?', "%#{tag}%"]) 

在哪裏標籤是你的包含字符串

按@bjg評論變量: -

或者在Rails 3中你會使用新寫爲

Model.where(["name LIKE :tag", {:tag => tag}]) 

取景器語法 -

+2

或者在Rails 3中,你會寫爲'Model.where([ 「名稱,如:標籤」,{:標籤=>標籤}])'使用新的取景器語法 – bjg 2010-07-21 23:34:36

+0

但我怎麼告訴RoR3在「名稱」列中搜索該模型的所有列? – 2010-07-22 00:26:31

+0

@never_had_a_name檢查sphinx搜索引擎。檢查思維獅身人面像http://railscasts.com/episodes/120-thinking-sphinx – 2012-03-21 19:37:13

3

您還可以使用Arel的'匹配'方法:

Model.match(:name => tag) 

如果你想搜索所有列,那麼你應該寫一些額外的代碼。

+0

不適合我。 – squixy 2014-04-04 06:58:41

+0

不適用於我。使用'arel',我會這樣寫查詢:'Model.where(Model.arel_table [:name] .matches(「%#{query_string}%」))' – tsikov 2014-06-02 21:13:43

2

我覺得acts_as_ferret插件將是完美的滿足您的需求,這個插件讓你輕鬆配置非常酷的指標像

ActsAsFerret::define_index('my_index', 
         :models => { 
          SomeModel => { 
          :fields => { 
           :name => { :boost => 4, :store => :yes, :via => :ferret_title }, 
           :foo => { :store => :no, :index => :untokenized }, 
           :baz => { :store => :yes, :via => :ferret_content } 
          } 
          } 
         }) 

所有acts_as_ferret索引在一個單一的文件進行配置,RAILS_ROOT /配置/ aaf.rb

+0

不僅Ferret。斯芬克斯的思維獅身人面像也很好地與AR整合在一起。一般來說,使用全文索引軟件是一個好主意。 – skalee 2010-08-10 16:16:47

+0

費雷的後方疼痛。這很慢,它很容易引起腐敗,我只有問題。思維獅身人面像是要走的路。 – 2010-08-13 01:34:23