2015-02-23 72 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