2015-02-23 31 views
-2

我想在Rails上的ActiveRecord中的where()方法中實現一個lambda。這裏是我的代碼:Rails Lambda ActiveRecord

@applications.where { |app| !((calculate_days_ago(app.shipping_date) >= 10 && calculate_days_ago(:app.shipping_date) <= 19) || app.followup_calls.count == 0) } 

@applicationsActiveRecord(例如Application.all)。但是,當我試圖訪問它(例如orderwhere),它的類型是變化WhereChain,我有一個例外:

未定義的方法',其中」爲#ActiveRecord :: QueryMethods :: WhereChain:0x6fb1000 >

有沒有一種方法可以在我的where()條件下使用適當的返回類型實現lambda表達式?

注意:我來自C#背景,這樣的lambda可以這樣做,我是Ruby on Rails的新手。我不知道這個社區與downvotes bash新手。盡我所能讓我的問題儘可能清楚。

+1

你是如何將塊傳遞給'#where'?我從來沒有見過這樣的文件。請鏈接 – 2015-02-23 09:29:35

+3

什麼是@applications?通常你會在類上調用'.where',例如'Application.where(....' – 2015-02-23 09:29:40

+0

@JohnIsaiahCarmona你可以傳遞一個塊給任何方法,但是它會被忽略,除非該方法調用該塊。 – Stefan 2015-02-23 09:42:02

回答

3

where方法不會使用(或至少它不會使用)傳遞給它的任何塊。如果您想篩選基於任意Ruby代碼,然後用

@applications.select {|app| !((calculate_days_ago(app.shipping_date) >= 10 && calculate_days_ago(:app.shipping_date) <= 19) || app.followup_calls.count == 0) } 

要知道,雖然這種提取匹配的範圍以往任何條件的所有行,用他們創建活動記錄的對象,然後過濾他們 - 如果可能一般來說重寫速度要快很多,例如使用where

@applications.where(:shipping_date => (19.days.ago .. 10.days.ago)) 

除了這讓事情的關係,所以你可以繼續鏈額外whereorder等電話。

+0

謝謝,但是'select'返回一個'Array',我無法使用'where'。你的第二個例子翻譯成「發貨日期是10到19天以前「? – 2015-02-23 09:58:56

+0

@john確實如此 – 2015-02-23 10:00:03

+0

非常感謝!你知道一種方法來實現我的第二個條件('app.followup_calls.count == 0')嗎?我與'followup_calls'有一對多的關係'桌子和我n是否知道它是否沒有跟進? – 2015-02-23 10:03:05