2014-09-25 94 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