我創建了一個 Ruby on Rails 專案。它使用 Rails 作為后端和前端。
幾個月前,我擁有它,以便您可以通過搜索遠足名稱中的關鍵字來搜索遠足。匹配搜索的遠足將顯示在螢屏上。
但是,我最近注意到這不再起作用了。但是,實際上并沒有在任何地方顯示錯誤。
但是,我進行了一些挖掘并注意到 binding.pry 我在 Hike 模型中的 LIKE 查詢不再有效。
我覺得我的 Hike 模型中的方法應該像這樣編碼:
def self.search_by_name(search)
if search
Hike.where("name LIKE ?", "%#{search}%")
end
end
從我的窺探中,我注意到這種方法正在被擊中,并且搜索作為一個引數正確地通過了。但是,Hike.where("name LIKE ?", "%#{search}%")在 binding.pry 中執行操作會回傳一個空陣列,如圖所示(不確定顯示的第二行"hikes".*是否應該顯示):
pry(Hike)> Hike.where("name LIKE ?", "%#{search}%")
Hike Load (0.7ms) SELECT "hikes".* FROM "hikes" WHERE (name LIKE '%park%')
? app/models/hike.rb:18:in `search_by_name'
=> []
我最近將我的資料庫從 SQLite 切換到 PostgreSQL,所以也許這種變化需要在上述方法中的查詢中使用不同的語法?
下面是我的 HikesController 的外觀,您可以在其中看到 if params[:q],這意味著如果有人在搜索中鍵入,我將設定@hikes等于.search_by_name傳遞搜索詞的方法的呼叫。如上所示,當您搜索一個單詞時,該.search_by_name方法回傳一個空陣列,而我一直在搜索資料庫中特定遠足名稱中的單詞。
class HikesController < ApplicationController
before_action :require_login
def index
if params[:hike] && params[:hike][:":location"] != "None"
@hikes = Hike.search(params[:hike][:":location"])
elsif params[:q]
@hikes = Hike.search_by_name(params[:q])
else
@hikes = Hike.all
end
end
def require_login
return head(:forbidden) unless session.include? :user_id
end
end
提醒一下,此搜索功能以前可以使用。不知道為什么現在不是,但我很好奇它是否與將我的資料庫從 SQLite 切換到 PostgreSQL 后可能需要的更改有關。任何幫助,將不勝感激。
另外,我應該注意到,在從 SQLite 遷移到 PostgreSQL 之后,我的資料庫似乎確實被正確填充了。在RailsHike.all控制臺中進行操作仍然給了我所有的種子徒步旅行。
uj5u.com熱心網友回復:
在 SQLite 中,like默認情況下不區分大小寫。%park%將匹配Park。
在 Postgres 中,它是區分大小寫的。為了使其不區分大小寫,請使用ilike.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/433908.html
