2011-05-12 65 views
0

我有一个“课程”模型,has_many时隙。Rails 3:过滤和范围“不能将散列转换为整数”问题

在课程模式,我有以下几种方法:

def available_timeslots 
    tsarray = [] 
    self.timeslots.map{ |t| 
    if t.available then 
     tsarray << t 
    end 
    } 
    tsarray 
end 

def earliest_slot 
    self.available_timeslots.first(:order => :starting_date) 
end 

我想要现在做的就是让每门课程最早的可用时隙。没有可用性过滤器,@ course.earliest_slot工作正常。但是,如果我尝试@ course.available_timeslots.earliest_slot带回“无法将散列转换为整数”消息。

任何建议赞赏

+0

未经测试的思想:它看起来像':为了= >:starting_date'是传递给'Array'的'first'方法的散列。 'first' [带有一个可选的整数参数](http://www.ruby-doc.org/core/classes/Array.html#M000222)(例如“返回前20个元素”)。尝试将该参数移除到“第一个”方法。也许在两个单独的调用中返回的对象类型是不同的(proxy?),这就是为什么你看到使用简单的'Array'的调用错误。 – Zabba 2011-05-13 00:12:56

回答

2

Zabba的评论是正确的钱。 available_timeslots方法返回一个数组,并且您首先调用该方法 - 但这与在Rails关联返回的对象上首先调用该方法的方法不同。

我想你想使用范围。所以删除您available_timeslots方法和添加到您的时隙等级:

scope :available, where(:available => true) 

然后在earliest_slot方法,你可以做

self.timeslots.available.first(:order => :starting_date) 

,它将返回第一个可用时隙由“所指的过程自'。

(注:我想提出的假设是“可用”是一个布尔如果是别的东西,适当地更改范围WHERE条件。)

+0

我同意使用范围,但是对于取景器,为什么不: self.timeslots.available.order(“starting_date”)第一 我想在Rails 3中,使用#order最好传入它作为论据。至少从导游来看似乎是这样。 – 2011-05-13 07:38:32