我是ruby on rails的新手,我不知道从哪里开始。我有一个用户模型,一个用于项目。用户有很多项目,项目有一个用户。项目表中有一个end_date列(以及一个名称列)。
我想要做的是找到最近的end_date项目,并在用户的显示页面上显示它的名称和结束日期。
我尝试将此代码放在项目控制器中,但我不知道它是否正常工作,因为我不知道如何访问它并在视图中显示项目名称。
def next_deadline(after = DateTime.now, limit = 1)
find(:all, :conditions => ['end_date > ?', after], :limit => limit)
end
任何帮助将不胜感激。如果需要更多信息,请告诉我。
答案 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 %>