簡體   English   中英

如何從按其ID的特定順序排序的記錄數組中獲取ActiveRecord :: Relation?

[英]How can I get an ActiveRecord::Relation from an array of records sorted in a specific order of their IDs?

我有一個Rails引擎,它在所選模型上定義一個類方法top(count) 此方法的作用是從Redis中的有序集(ZSET)中獲取count ID。 這個想法是這個模型的每個項目都有一個分數,這個方法是返回“最佳”記錄。 該方法基本上如下所示:

def self.top(count = 1)
  ids = redis.zrevrange(self.score_set, 0, count - 1)
  items = self.find ids

  if count == 1
    return items.first
  else
    return items.sort { |x, y| ids.index(x.id) <=> ids.index(y.id) }
  end
end

正如您所看到的,我目前正在對記錄進行排序,因為數據庫(或適配器)在通過多個ID查找時往往不會保持順序。 例如, Model.where('ID IN (?)', ids)將按升序ID而不是傳遞的ID的順序排序。

對項進行排序會返回一個Array ,但我希望此方法返回一個ActiveRecord::Relation以便我的用戶可以使用其他ActiveRecord查詢方法將其鏈接。 有沒有辦法可以使用內置的ActiveRecord查詢方法來維護我的ID數組的順序? 或者,有沒有辦法從記錄數組構建ActiveRecord::Relation

這實際上取決於您使用的基礎數據庫。 我不認為rails有一個很好的方法來做到這一點。

我有一個應用程序,我在做同樣的事情。 在Redis ZSET中存儲ID,然后需要按順序獲取它們。 由於我們使用MySql,我們可以利用字段功能

Model.where('id in (?)', ids).order("field(id, #{order})")

PS:確保您的order變量已經過消毒!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM