【问题标题】:Creating a scope on an ActiveRecord Model在 ActiveRecord 模型上创建范围
【发布时间】:2014-09-25 01:27:22
【问题描述】:

我有一个名为 Panda 的 ActiveRecord 模型,其中有一个名为 variant 的列,它可以包含诸如“bam-abc”、“bam-123”、“boo-abc”和“boo-123”之类的值。我想创建一个范围选择变体以“boo”开头的所有记录。

在控制台中,我可以使用以下命令选择那些记录(以“boo”开头):

Panda.select{|p| p.variant.starts_with? 'boo'}

有没有办法把它变成 Panda 类的作用域?我需要能够在我的 RSpec 测试范围内执行“to_sql”。

【问题讨论】:

    标签: ruby activerecord rails-activerecord


    【解决方案1】:

    您希望使用scope 将 LIKE 发送到数据库中,例如:

    scope :boos, -> { where('pandas.variants like ?', 'boo%') }
    

    或者等效地,使用类方法:

    def self.boos
      where('pandas.variants like ?', 'boo%')
    end
    

    然后你可以这样说:

    Panda.boos.where(...)
    Panda.where(...).boos
    Panda.boos.where(...).to_sql
    Panda.where(...).boos.to_sql
    

    如果您认为要与其他可能使variant 名称不明确的表进行联接,则只需在列名称上使用pandas 前缀。如果您永远不会进行 JOIN,或者您的数据库中只有一个 variant 列,那么您可以使用以下之一:

    scope :boos, -> { where('variants like ?', 'boo%') }
    
    def self.boos
      where('variants like ?', 'boo%')
    end
    

    【讨论】:

    • 谢谢,很好的回答,非常全面!
    【解决方案2】:

    将下面的行添加到 Panda 类中

    scope :boo, -> { where('variant LIKE ?', 'boo%') }
    

    然后您可以使用Panda.boo 来获取所有以 boo 开头的变体记录。 Panda.boo.to_sql会给你sql

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多