[英]How can i convert an array to an rails ActiveRecord::Relation without changing array order?
[英]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.