2014-09-25 34 views
0

我有一个称为Panda的ActiveRecord模型,其中包含一个名为variant的列,它可以由'bam-abc','bam-123','boo-abc'和'boo- 123'我想要创建一个范围,选择变体以'boo'开头的所有记录。在ActiveRecord模型上创建作用域

在控制台中,我可以选择这些记录与以下(以“嘘'):

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

有没有办法把它们插入熊猫一流的范围是什么?我需要能够在我的RSpec测试的范围内执行'to_sql'。

回答

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 

您只需要使用pandas pref如果您认为您将与其他表格进行联接,可能会使variant名称不明确,请将其列入名称。如果你永远也不会做的加入或你永远只能有一个variant列在您的数据库,那么你可以使用一个:

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

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

谢谢,很好的回答,非常全面! – rainslg 2014-09-25 13:20:32

0

添加下面的一行到熊猫类

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

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