1

Ruby on Rails は初めてで、どこから始めればよいかわかりません。ユーザー用のモデルとプロジェクト用のモデルがあります。ユーザーには多くのプロジェクトがあり、プロジェクトには 1 人のユーザーがいます。プロジェクト テーブルには 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/consoleRails < 3、rails cRails >= 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

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

User モデルでは、次のように書くことができます

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 に答える
0

:conditions ではなく :order を使用します。

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

最初の結果は、end_date が最も近いアイテムになります。

于 2012-04-17T15:18:56.800 に答える