【问题标题】:When using a Scope, when should one use hash notation vs a string?使用 Scope 时,什么时候应该使用哈希表示法而不是字符串?
【发布时间】:2011-11-18 18:38:42
【问题描述】:

我刚刚开始熟悉范围,我发现它们可以使用字符串或哈希表示法来编写。

来自 rails 文档的示例:

scope :dry_clean_only, joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true)

这也可以写成:

scope :dry_clean_only, joins(:washing_instructions).where(:washing_instructions => { :dry_clean_only => true })
  • 您如何选择使用哪一种?
  • 是否有性能 影响?
  • 有“导轨方式”吗? (文档有点洒 用法)

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 scope named-scope


    【解决方案1】:

    我个人尽可能使用哈希语法,并在不可避免时使用字符串。

    scope :plus_size, where(:plus_size => true)
    

    scope :similar_name, lambda{ |name| where('name LIKE ?', "%#{name}%") }
    

    我担心我的 SQL 写错了,所以我写的越少越好(比如上面的例子,它不会转义字符串中多余的 %)。

    【讨论】:

      【解决方案2】:

      至于选择哪一个,这确实是一个偏好问题。我个人更喜欢哈希语法,因为您可以扫描它并轻松查看哪些参数适用于哪些列。哈希语法仅适用于相等查询,因此无论如何您都需要将字符串格式用于更复杂的查询。

      我敢打赌,性能差异可以忽略不计,因为它已转换为 SQL 查询。访问数据库并处理结果将是大部分处理时间发生的地方,并且在两种情况下都是相同的。

      如果你想对它们进行基准测试,你可以使用 rails benchmark。

      rails benchmarker "Model.joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true)" "Model.joins(:washing_instructions).where(:washing_instructions => { :dry_clean_only => true })"
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 2016-07-11
        • 2012-06-07
        • 2013-04-24
        • 2018-11-21
        • 1970-01-01
        • 2019-06-15
        • 2010-10-13
        相关资源
        最近更新 更多