2011-03-27 197 views
0

我有以下的模型對象:Issue.owner = [array]命名範圍語法

我試圖建立一個範圍,在範圍搜索陣列特定整數,比如這個:

scope :tagged_in_issue, where("issues.owner.include?(1)", true) 

哪裏有我錯了?

+0

你想所有者場在它的任何地方有「1」還是隻有「1」? 所有者是Ruby相關字段(owner_id)還是簡單整數字段(所有者)? scope:tagged_in_issue,where(「issues.owner =?」,1) – 2011-03-27 17:15:54

+0

請看這裏的「Cross Model Scopes」部分:http://edgerails.info/articles/what-s-new-in-edge- rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html。你真正想做的就是做一個JOIN。 – scragz 2011-03-27 18:12:44

+0

在此定義的範圍是什麼? 問題表的所有者列中的其中一個值是什麼樣的? 如果它是一個序列化的ruby整數數組,你將需要一個特定的查詢,如果你有一個連接模型,那麼你需要一個不同的查詢。 – 2011-03-27 19:02:28

回答

1

你可以這樣添加方法。所以,你可以這樣來做。如果你想通過SQL做到這一點(紅寶石路)

class Issue < AR::Base 
    def self.tagged_in_issue(n) 
    all.select{|a| a.owner.include?(n)} 
    end 
end 

Issue.tagged_in_issue(1) 
#=> Array of issues 

,所以你應該說明屬性是什麼owner,從哪裏存儲

+0

聰明和好的電話。這也適用。 – 2011-03-27 17:39:14

+1

根據您將要擁有的問題數量,轉儲整個數據庫可能會非常低效,並循環遍歷所有數據庫。 – scragz 2011-03-27 18:10:30

+0

@scragz,+1,但JZ沒有給我們提供關於「所有者」性質的信息 – fl00r 2011-03-27 18:11:34

1

你不能在需要SQL的地方使用Ruby。 where子句的參數應該可以在SQL中使用,例如文字字符串,帶佔位符的數組或帶有列 - 值對的散列。

您需要做的是將您的查詢重新短語作爲SQL WHERE子句。因爲你需要scope我的做法是不是你需要的東西

class Issue < AR::Base 
    def tagged_in_issue?(n) 
    owner.include?(n) 
    end 
end 

@issue.tagged_in_issue(1) 
#=> true 
@issue.tagged_in_issue(2) 
#=> false 

UPD

據:

+0

好吧,我有麻煩了。哈哈。如何在SQL中搜索數組然後搜索整數1? – 2011-03-27 16:57:43

+0

你是什麼意思數組? SQL確實沒有這些。它確實有結果集。也許你想要的是'issues.where(:owner_id => 1)',但如果你使用的是'serialize'列,那麼這將不起作用,因爲它存儲在SQL不能理解的格式中。 – tadman 2011-04-01 15:47:20