在RoR中查找并显示最近的日期

时间:2012-04-17 15:10:28

标签: ruby-on-rails

我是ruby on rails的新手,我不知道从哪里开始。我有一个用户模型,一个用于项目。用户有很多项目,项目有一个用户。项目表中有一个end_date列(以及一个名称列)。

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

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

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

任何帮助将不胜感激。如果需要更多信息,请告诉我。

4 个答案:

答案 0 :(得分:4)

正如@Dan所提到的,你确实需要:order子句来获取第一个,但你应该将它添加到你的查询而不是替换:conditions(否则你将获得项目无论你的end_date论证如何,最早的after。你定义这种方法的方式有点过时了。它应该在你的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

或者在Rails&gt; = 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控制台测试此类代码:Rails&lt; script/console 3,Rails中的rails c&gt; = 3。

答案 1 :(得分: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")

答案 2 :(得分:0)

您想要使用:order,not:conditions。

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

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

答案 3 :(得分:0)

正如丹所说,你写的条件不会得到最近的结束日期,而是大于今天的日期,或作为参数传递的日期。

在您的用户模型中,您可以编写

def next_deadline_project
   self.projects.first
end

只要您为项目提供一个默认范围,该范围按end_date

命令记录

为了显示有关视图的信息,您必须在User的controller show方法中的实例变量中设置它。实例变量将传递给视图,您可以访问它们以显示数据。

@project = next_deadline_project

在show.html.erb中,您可以使用以下内容:

<%= @project.name %> - <%= @project.end_date %>