如果我已經在使用 Pagy,將 pagy_search 集成到我的索引中的最佳方法是什么?在我的控制器中,我目前有:
def index
@gold_drivers = Driver.gold_plan
@silver_drivers = Driver.silver_plan
@free_drivers = Driver.free_plan
@pagy, @drivers = pagy_array(
@gold_drivers @silver_drivers @free_drivers,
page: params[:page],
items: 16
)
if params[:query].present?
@drivers = @gold_drivers @silver_drivers @free_drivers
drivers_search = Driver.pagy_search(params[:query])
@pagy, @drivers = pagy_meilisearch(drivers_search, items: 25, page: params[:page])
end
end
我有一個 Driver 模型,它委托給 Profile 模型。不幸的是,當我點擊搜索時,我得到
Driver#first_name delegated to profile.first_name, but profile is nil: #<Driver id: 224...據我所知,該驅動程式沒有組態檔,但運行 @gold_drivers = Driver.gold_plan / @silver_drivers = Driver.silver_plan 等的查詢不應選擇沒有組態檔的驅動程式。
Driver.gold_plan 后面的查詢是:
find_by_sql("SELECT drivers.*, (profiles.no_races profiles.no_poles profiles.no_podiums profiles.no_wins) AS scores FROM drivers INNER JOIN profiles ON profiles.driver_id = drivers.id INNER JOIN subscriptions ON subscriptions.driver_id = drivers.id WHERE subscriptions.status = 'active' AND profiles.first_name != null OR profiles.first_name != '' AND subscriptions.stripe_plan = '#{ENV["GOLD_ANNUAL"]}' OR subscriptions.stripe_plan = '#{ENV["GOLD_MONTH"]}' GROUP BY scores, drivers.id ORDER BY scores DESC")
在那個查詢中,我使用"AND profiles.first_name != null OR profiles.first_name != ''"的是在 pagy_page 部分有效的,但在 pagy_search 部分無效。
對此的任何方向表示贊賞!
uj5u.com熱心網友回復:
首先:您的代碼效率極低,因為:
- 它執行 3 個查詢而不是 1 個
- 它將所有記錄拉入記憶體(可能會使您的服務器崩潰)并將它們加入一個陣列中,使用更多記憶體來創建另一個可能很大的物件
- 它使用
pagy_array,不應該那樣使用
所以讓我們開始改變它。
- 不要使用
而是創建一個單一的范圍,將 3 個范圍(黃金、白銀、計劃)組合在一起(這也應該是 AR 關系,而不是文字查詢)。這將為您提供一個單一的 AR 關系,尚未將任何內容加載到記憶體中 - 直接使用 AR 關系
pagy而不是pagy_array: 這將只提取您將需要的記錄頁面,而不是您不需要的全部記錄 - 使用相同的 AR 關系
pagy_meilisearch,您的問題可能會在沒有進一步更改的情況下消失。如果沒有,請查看您的范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429661.html
標籤:轨道上的红宝石 PostgreSQL 美利搜索 佩吉
