2012-04-17 63 views
1

我是红宝石的新手,我不确定从哪里开始。我有一个用户模型,一个用于项目。用户有很多项目,项目有一个用户。项目表中有一个end_date列(以及一个名称列)。在RoR中查找并显示最近的日期

我想要做的是找到最接近end_date的项目,并在用户的显示页面上显示它的名称和结束日期。

我试着将这段代码放在项目控制器中,但我不知道它是否工作,因为我不知道如何访问它并在视图中显示项目名称。

def next_deadline(after = DateTime.now, limit = 1) 
    find(:all, :conditions => ['end_date > ?', after], :limit => limit) 
end 

任何帮助,将不胜感激。让我知道是否需要更多信息。

回答

4

正如@丹所提到的,你需要的:order条款要获得第一个,但你应该把它添加到你的查询,而不是取代:conditions(否则你会得到该项目与不管你的参数是after,最早的end_date)。虽然你定义这种方法的方式有点不合适。它应该在您的Project模型(并且绝对是而不是控制器)中定义为类方法,或者我认为是一种更好的方法,作为范围。在Rails < 3(这似乎是你正在使用):

class Project < ActiveRecord::Base 
    named_scope :next_deadline, Proc.new { |after = DateTime.now, limit = 1| {:conditions => ['end_date > ?', after], :order => "end_date ASC", :limit => limit} } 
    ... 
end 

或者在滑轨> = 3:

class Project < ActiveRecord::Base 
    scope :next_deadline, Proc.new { |after = DateTime.now, limit = 1| where('end_date > ?', after).order("end_date ASC").limit(limit) } 
    ... 
end 

此外,您还可以使用Rails的控制台始终测试这种代码:script/console in Rails < 3,rails c in Rails> = 3.

0

您想使用:order,not:conditions。

Model.find(:all , :order => "end_date ASC") 

然后第一个结果将是最接近END_DATE项目

0

正如丹说,你写不会得到最近结束日期的情况,但有大于今天的日期,或作为参数传入的日期。

在您的用户模型,你可以写

def next_deadline_project 
    self.projects.first 
end 

只要你给项目默认范围的订单记录在END_DATE

为了显示对视图的信息,你必须将其设置在用户控制器显示方法中的实例变量。实例变量传递给视图,您可以访问它们以显示数据。

@project = next_deadline_project 

而在你show.html.erb您可以使用类似:

<%= @project.name %> - <%= @project.end_date %> 
1
@projects = Project.find_by_sql("SELECT projects.* FROM projects 
    JOIN users ON users.id = projects.user_id AND projects.user_id = " + @user.id.to_s + " 
    WHERE projects.end_date > now() 
    ORDER BY projects.end_date ASC 
    LIMIT " + limit) 

@projects = Project.where(:user_id => @user.id) 
        .where("end_date > ?", DateTime.now) 
        .order("end_date ASC")