【问题标题】:Getting multiple hashes from a single request in rails & SQL从 Rails 和 SQL 中的单个请求获取多个哈希值
【发布时间】:2011-07-19 23:43:49
【问题描述】:

我想做一些有点像-

@apples  = Fruit.find :all, :conditions => ["type = ?", "apple"]
@pears   = Fruit.find :all, :conditions => ["type = ?", "pear"]
@tomatos = Fruit.find :all, :conditions => ["type = ?", "tomato"]

问题是这需要 3 个数据库请求。有没有办法将这些结合起来,这样它只发出 1 个请求,但获得所有必需的信息?

谢谢, 亚历克斯

【问题讨论】:

  • 其实这是你能做的最好的。您可以执行一个请求,然后使用 Ruby 按组拆分 rsult
  • 啊,没有神奇的 RoR 技巧!我知道你可以将结果拆分为 ruby​​,但如果你有一个大数据库,这可能会很麻烦。

标签: sql ruby-on-rails ruby database request


【解决方案1】:

就像comment 中已经说过的那样,运行一个大查询并获取所有条目,然后通过 Ruby 选择它们可能会让人头疼。有几个理由让 MySQL(或您正在使用的任何数据库)完成这项工作:

  1. 如果有 100 万个条目,Ruby 必须实例化 100 万个 ActiveRecord 对象。这会非常快地消耗内存,并且会使您的应用程序无法使用,尤其是在生产环境中。想象一下有 100 个用户访问您的网站,而您的每个 dyno(希望您有不止一个)必须加载 100 万个条目并比较 100 万个字符串!

  2. 让数据库完成它们的工作。他们喜欢他们的工作,而且他们真的很擅长。事实上,它们已针对运行此类查询进行了优化。如果您的数据库看起来很慢,请检查您的索引并在必要时对其进行调整。

  3. 如果有一个大查询然后将其拆分,而不是 3 个变量,每个变量在其自己的行中定义和获取,这会使您的代码变得丑陋甚至不可读。

【讨论】:

    【解决方案2】:

    我认为您可能需要获取类型可能是“apple”或“pear”或“tomato”的所有水果,然后在 ruby​​ 中迭代以创建所需的 Fruits 集合。

       @fruits = Fruit.find :all, :conditions => ["type = ? or type =? or type =? , "apple", "pear", "tomata"]
    

    然后在 ruby​​ 中你可以做这样的事情(非常基本)。

     @apples = @fruits.select{|f| f.type == "apple"}
    

    【讨论】:

    • 首先,Rails 足够聪明,可以执行以下操作:@fruits = Fruit.find(:all, :conditions => { :type => %w[apple pear tomato]}),其次,这种方法比访问数据库 3 次要慢得多。如果您的数据库有 100 万个条目,那么 Ruby 必须实例化 100 万个对象!
    • 性能是一个完全不同的问题。据我所知,在 ruby​​ 中实例化对象或进行选择是否会比数据库命中(网络或 i/o 调用)更快(如在内存中),但可能会因具体情况而异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2016-07-22
    • 2021-07-16
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多