Ruby 在ActiveRecord模型上创建作用域

Ruby 在ActiveRecord模型上创建作用域,ruby,activerecord,rails-activerecord,Ruby,Activerecord,Rails Activerecord,我有一个名为Panda的ActiveRecord模型,其中有一个名为variant的列,它可以由“bam abc”、“bam-123”、“boo abc”和“boo-123”等值组成。我想创建一个范围,用于选择变量以“boo”开头的所有记录 在控制台中,我可以选择以下记录(以“boo”开头): Panda.select{|p| p.variant.starts_with? 'boo'} 有没有办法把它变成熊猫类的作用域?我需要能够在RSpec测试的范围内执行“to_sql” 您可能希望使用将L

我有一个名为Panda的ActiveRecord模型,其中有一个名为variant的列,它可以由“bam abc”、“bam-123”、“boo abc”和“boo-123”等值组成。我想创建一个范围,用于选择变量以“boo”开头的所有记录

在控制台中,我可以选择以下记录(以“boo”开头):

Panda.select{|p| p.variant.starts_with? 'boo'}
有没有办法把它变成熊猫类的作用域?我需要能够在RSpec测试的范围内执行“to_sql”

您可能希望使用将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
如果您认为要与其他表进行联接,可能会使
变量
名称不明确,则只需在列名上使用
pandas
前缀。如果您永远不会进行连接,或者您的数据库中只有一列
variant
,那么您可以使用以下其中一列:

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

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

将下面的行添加到Panda类

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

然后,您可以使用
Panda.boo
获取所有变量以boo开头的记录
Panda.boo.to_sql
将为您提供sql

谢谢,回答得很好,非常全面!