Ruby 在ActiveRecord模型上创建作用域
我有一个名为Panda的ActiveRecord模型,其中有一个名为variant的列,它可以由“bam abc”、“bam-123”、“boo abc”和“boo-123”等值组成。我想创建一个范围,用于选择变量以“boo”开头的所有记录 在控制台中,我可以选择以下记录(以“boo”开头):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.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谢谢,回答得很好,非常全面!