在ActiveRecord模型上创建范围

时间:2014-09-25 01:27:23

标签: 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'。

2 个答案:

答案 0 :(得分:1)

您希望使用发送LIKE的scope进入数据库,例如:

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名称不明确的表进行JOIN,则只需要在列名称上使用variant前缀。如果您永远不会进行JOIN,或者您的数据库中只有一个variant列,那么您可以使用以下其中一个:

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

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

答案 1 :(得分:0)

将以下行添加到Panda类

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

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