讓我們看看DB特定選項。
class Article
# ...
def self.random(limit: 10)
scope = Article.where(published: true)
# postgres, sqlite
scope.limit(limit).order('RANDOM()')
# mysql
scope.limit(limit).order('RAND()')
end
end
Article.random
詢問數據庫,以獲得10個隨機記錄我們。 因此,讓我們看看如何將添加一個選項排除一些記錄:
class Article
# ...
def self.random(limit: 10, except: nil)
scope = Article.where(published: true)
if except
scope = scope.where.not(id: except)
end
scope.limit(limit).order('RANDOM()')
end
end
現在Article.random(except: [1,2,3])
將獲得10條記錄,其中ID是不[1,2,3]
。
這是因爲rails中的.where
返回一個可鏈接的作用域。例如:
> User.where(email: '[email protected]').where.not(id: 1)
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 AND ("users"."id" != $2) [["email", "[email protected]"], ["id", 1]]
=> #<ActiveRecord::Relation []>
,我們甚至可以在這裏傳遞範圍:
# cause everyone hates Bob
Article.random(except: Article.where(author: 'Bob'))
爲什麼一個DB具體的解決方案是在這裏一個不錯的選擇見Rails Quick Tips - Random Records。
來源
2016-09-25 14:44:44
max
我該如何添加「AND?」我想要一個發佈的地方:真,不在範圍內。 – josh
更改where子句。我編輯了答案。 – inye
請參閱@ Max關於鏈接哪裏調用通常更清潔的建議:'Article.where(published:true).where.not(id:ids_to_exclude).order(「RANDOM()」)' – gmcnaughton