代码之家  ›  专栏  ›  技术社区  ›  cbrulak

Rails:从MySQL数据库获取随机项列表

  •  1
  • cbrulak  · 技术社区  · 16 年前

    我知道我需要 Tags.all.rand (重复10次)但是,这并不能保证唯一性。

    我知道我可以使用SQL查询,但由于我的开发环境在生产中使用sqlite作为db和MySQL, ORDER by RAND 两者都不行。

    除了有两个不同的查询(Dev&我还能做什么?

    谢谢

    3 回复  |  直到 16 年前
        1
  •  2
  •   Olly    16 年前

    您可以使用以下方法随机选择20个标记:

    Tag.all.sort_by {rand}[0..19]
    

    (感谢chubas提供了这个简单的解决方案!)

    这样做的缺点是,它在大型数据集上效率低下。您可以通过仅选择以下ID来改进这一点:

    Tag.all(:select => :id).map(&:id).sort_by{rand}[0..19]
    
        2
  •  2
  •   Ryan Bigg Andrés Bonilla    16 年前

    为什么要使用两个不同的数据库进行开发和生产?这可能会导致进一步的问题。以最近发生在我们身上的事情为例,我们的一个开发人员使用了MySQL,并且使用了一种特殊的MySQL-only-LIKE语法,这种语法在我们的PostgreSQL产品数据库中不起作用。

    故事的士气:如果你在开发、测试和/或生产中使用了不同的东西:那你就做错了。

    下一步:要获取MySQL中的随机项,可以执行以下操作: Tag.all(:order => "RAND()", :limit => 10) .

        3
  •  2
  •   Chubas    16 年前

    Ryan的答案是正确的,但是有个问题。如果数据集非常大,:order=>RAND()”是不切实际的(查询将运行得非常慢)。有两种可选方法:首先获取项目的所有ID,随机选择20,然后获取这些行,或者获取数据库中的项目数,选择一个具有随机偏移量的项目,然后重复(首先选择偏移量以保证没有重复项)。

    请在中阅读更多关于此的信息 SQL Antipatterns

    Array#sample