1

我是 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

4 回答 4

4

正如@Dan 提到的,您确实需要该:order子句来获取第一个子句,但您应该将其添加到您的查询中而不是替换(否则无论您的论点如何,您:conditions都将获得最早的项目)。不过,您定义此方法的方式有点偏离。它应该在您的模型(绝对不是控制器)中定义为类方法,或者,我认为更好的方法,作为范围。在 Rails < 3 中(您似乎正在使用它):end_dateafterProject

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 >= 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在 Rails < 3 中,rails c在 Rails >= 3 中。

于 2012-04-17T15:34:50.197 回答
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")
于 2012-04-17T15:27:46.203 回答
0

你想使用:order,而不是:conditions。

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

那么第一个结果将是最接近 end_date 的项目

于 2012-04-17T15:18:56.800 回答
0

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

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

def next_deadline_project
   self.projects.first
end

只要您给项目一个按 end_date 排序记录的默认范围

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

@project = next_deadline_project

在你的 show.html.erb 你可以使用类似的东西:

<%= @project.name %> - <%= @project.end_date %>
于 2012-04-17T15:25:15.747 回答