2012-04-17 16 views
1

私はレール上で初めてRubyを使用しています。私はユーザーのためのモデルとプロジェクトのためのモデルを持っています。ユーザーには多くのプロジェクトがあり、プロジェクトには1人のユーザーがいます。プロジェクトテーブルにはend_date列(および名前列)があります。RoRで最も近い日付を見つけて表示する

私がしたいことは、最も近いend_dateを持つプロジェクトを見つけて、ユーザーの表示ページにその名前と終了日を表示することです。

私はこのコードをプロジェクトコントローラに入れようとしましたが、それが動作しているかどうかわかりません。どのようにアクセスして、プロジェクト名を表示するかわからないからです。

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

助けてください。さらに情報が必要な場合は教えてください。

答えて

4

を最初のものを取得するには、クエリに追加して: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,in Rails> = 3

0

ご希望のもの:オーダー、不可、条件。

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

は、その後最初の結果は、最も近いEND_DATEを持つアイテムになります

0

ダンが言ったように、あなたは最寄りの終了日を取得することはありません書いた条件が、今日よりも大きい日付、またはパラメータとして渡された日付。

あなたのUserモデルで

あなたは限り、あなたはプロジェクトにビューについての情報を表示するためにはEND_DATE

により、受注レコードは、あなたがそれを設定しなければならないことをデフォルトのスコープを与えるよう

def next_deadline_project 
    self.projects.first 
end 

を書くことができユーザのコントローラのshow変数のインスタンス変数。インスタンス変数はビューに渡され、それらにアクセスしてデータを表示することができます。

@project = next_deadline_project 

そして、あなたのshow.html.erbであなたのようなものを使用することができます@Danが述べたように、あなたが:order句が必要です

<%= @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") 
関連する問題