關(guān)于搜索功能的一些感想

搜索是任何項目中必不可少的一項功能。在大多數(shù)應(yīng)用場景中,由于需要檢索的條件并不多,我們可以方便地使用get請求結(jié)合一些搜索類的gem(比如ransack)拢锹,輕松實現(xiàn)搜索功能,再配合will_paginate實現(xiàn)分頁功能萄喳。

但是卒稳,對于一些高級搜索頁面,往往會出現(xiàn)特殊的需求他巨,比如:

1.搜索的條件數(shù)量非常多——此時繼續(xù)用get請求來搜索充坑,會導(dǎo)致url過長而報錯(不同瀏覽器支持的url最大長度也不一樣);
2.需要在多張表之間join查詢——不能的搜索條件需要join不同的表染突,如果一次性全部join捻爷,效率必然很低。根據(jù)不同搜索條件來針對性地join份企,可提升搜索效率也榄;
3.需要優(yōu)化搜索代碼來提升搜索速度——比如搜索省份城市,需要對獲取的搜索數(shù)據(jù)進行處理分解司志;
4.需要搜索的字段甜紫,需要在數(shù)據(jù)庫中拼接幾個字段后再比較——比如搜索一個電話號碼,數(shù)據(jù)表中的電話號碼分為區(qū)號骂远、號碼囚霸、分機三個字段存儲,如果需要實現(xiàn)電話號碼的模糊搜索激才,必然需要用到類似于mysql中的concat功能拓型;
5.分頁問題——will_paginate默認只提供get方式的分頁额嘿,需要自己手動改造;

想要克服上述五個問題劣挫,就需要自己手動來寫搜索册养,以下是針對上述五個問題的我個人的解決方案:

1.改用post提交——post提交不會出現(xiàn)url過長的問題,比如原來的一個index頁压固,系統(tǒng)默認的路由捕儒,如果用post,會自動識別成create動作邓夕,此時有兩個方法解決,棄用index阎毅,自己建一個比如list的action焚刚,定義為post,避開系統(tǒng)的自動識別扇调;如果繼續(xù)想用ndex矿咕,如果快速搜索也需要用到get的index,則可以:

def index
list
end
然后
def index
xxxx
render template: "/xxx/index"
end

2.手動寫搜索代碼狼钮,判斷每個查詢參數(shù)是否被賦值碳柱,比如只有當(dāng)params[:province_ids]存在并有指時,才去join provinces表熬芜。搜索最終取決于三個變量 sql(拼接的sql語句)莲镣、joins(拼接的join語句)以及傳過來的搜索參數(shù)。sql和joins是兩個空數(shù)組涎拉,當(dāng)某個搜索參數(shù)有值時瑞侮,相應(yīng)地想這兩個數(shù)組push sql和join語句,最后通過下面的代碼實現(xiàn)搜索功能:

@objects = Example::Object.where([sql,@q]).joins(joins).paginate(per_page:20,page:params[:page])

3.對于省份城市的搜索鼓拧,由于省份城市可分為好幾級半火,比如區(qū)域(華東、華北季俩、華西钮糖、華南),省份(34個省級行政區(qū))酌住,和每個省份下的二級城市店归。我們可以同時搜索區(qū)域、省份赂韵、城市娱节。如果為了寫代碼方便,統(tǒng)一分解成二級城市來搜索祭示,那where city_id in (city_ids_string)機會非常長肄满,導(dǎo)致搜索效率很低谴古。因此需要分解。我的解決方案是:無論搜索哪一級稠歉,都將其id拼接成:“區(qū)域id_省份id_城市id”的格式掰担,如果只搜區(qū)域,則后面兩位都是0怒炸。比如光搜區(qū)域的带饱,歸入@region數(shù)組中,搜到省份的阅羹,無視區(qū)域其區(qū)域勺疼,直接歸入@province數(shù)組中,搜到二級城市的捏鱼,無視其區(qū)域和省份执庐,直接歸入@city中。通過分解导梆,最終可以得到這樣的搜索代碼:

where (region_id in @region or province_id in @province or city_id in @city)

4.這個問題相對好解決轨淌,直接使用使用數(shù)據(jù)庫的拼接字符串功能:

where concat(region_number, phone_number, ext_number) like '%xxx%'

5.這個問題我的解決方案是用jquery來重寫分頁鏈接的點擊事件,然后再頁面中設(shè)定一個隱藏的表單看尼,表單里有兩個隱藏的input递鹉,一個存儲上一次高級搜索所有的搜索參數(shù)(比如params[:q]),并且壓縮成json藏斩。還有一個就是page參數(shù)躏结。當(dāng)點擊分頁鏈接時,用jquery去取出這個分頁鏈接的page參數(shù)灾茁,然后賦值給表單中的page的input窜觉,最后以post形式再次提交表單(別忘了最后需要return false來阻止本身分頁鏈接功能)

至此,關(guān)于上述遇到的5個問題北专,我都給出了相應(yīng)的解決方案禀挫,可能不是優(yōu)秀的解決方案,但的確可以解決眼前的問題拓颓,歡迎大家一起討論或給出更加優(yōu)秀的解決方案语婴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驶睦,隨后出現(xiàn)的幾起案子砰左,更是在濱河造成了極大的恐慌,老刑警劉巖场航,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缠导,死亡現(xiàn)場離奇詭異,居然都是意外死亡溉痢,警方通過查閱死者的電腦和手機僻造,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門憋他,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人髓削,你說我怎么就攤上這事竹挡。” “怎么了立膛?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵揪罕,是天一觀的道長。 經(jīng)常有香客問我宝泵,道長好啰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任儿奶,我火速辦了婚禮坎怪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘廓握。我一直安慰自己,他們只是感情好嘁酿,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布隙券。 她就那樣靜靜地躺著,像睡著了一般闹司。 火紅的嫁衣襯著肌膚如雪娱仔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天游桩,我揣著相機與錄音牲迫,去河邊找鬼。 笑死借卧,一個胖子當(dāng)著我的面吹牛盹憎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铐刘,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼陪每,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镰吵?” 一聲冷哼從身側(cè)響起檩禾,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疤祭,沒想到半個月后盼产,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡勺馆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年戏售,在試婚紗的時候發(fā)現(xiàn)自己被綠了侨核。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜈项,死狀恐怖芹关,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情紧卒,我是刑警寧澤侥衬,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站跑芳,受9級特大地震影響轴总,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜博个,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一怀樟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盆佣,春花似錦往堡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痹兜,卻和暖如春穆咐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背字旭。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工对湃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遗淳。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓拍柒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屈暗。 傳聞我的和親對象是個殘疾皇子斤儿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法恐锦,內(nèi)部類的語法往果,繼承相關(guān)的語法,異常的語法一铅,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,814評論 0 11
  • Hive的部署解壓縮陕贮、重命名、設(shè)置環(huán)境變量在目錄$HIVE_HOME/conf/下潘飘,執(zhí)行命令mv hive-def...
    lufaqiang閱讀 446評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理肮之,服務(wù)發(fā)現(xiàn)掉缺,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 特別說明: 1戈擒、本文只是面對數(shù)據(jù)庫應(yīng)用開發(fā)的程序員眶明,不適合專業(yè)DBA,DBA在數(shù)據(jù)庫性能優(yōu)化方面需要了解更多的知識...
    安易學(xué)車閱讀 1,824評論 0 40