2012-04-17 64 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")