0

私は Rail が初めてで、ActiveRecord でクエリを作成しようとしています。ステータスが「上陸」で、60 日以上経過したすべてのレコードを取得しようとしています。私のクエリは、ステータスが「上陸」のすべてのプロジェクトを取得するまで機能します。「created_at < ?」という最後の条件を追加すると、常に空のリレーションが得られます。私はその説明に合うプロジェクトがあることを知っているので、クエリで何か間違ったことをしており、理解できません。私のエラーは日付の比較にあると思いますが、よくわかりません。

1. Projects
    belongs_to :status
    has_many :project_status_histories
2. Status
    has_many :projects
    has_many :project_status_histories
3. Project_Status_Histories
    belongs_to :status
    belongs_to :project

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}})

dbconsole を使用してクエリを段階的に作成しようとしましたが、うまくいきません。事前にご協力いただきありがとうございます。

4

2 に答える 2

4

日付演算ではないと思います。これを行う良い方法の 1 つは、名前付きスコープを使用することです。以下を project.rb に追加します。

scope :landed, joins(:status).where('statuses.name' => 'Landed')
scope :recent, lambda \
              { joins(:project_status_histories) \
              .where('project_status_histories.created_at < ?', Date.today - 60.days) } 

次に、関連するレコード/オブジェクトを次のように取得できます。

Project.landed.recent

これは私のテストでうまくいきました。Rails ガイドもチェックしてください。ここからほとんどを盗みました。

http://guides.rubyonrails.org/active_record_querying.html#scopes

于 2012-05-01T16:37:56.073 に答える
0

あなたのクエリは少し複雑です...

私はむしろこのようにしたい:

Project.where("status.name = ? AND project_status_histories.created_at < ?", "Landed", Time.now.day - 60.days)

これはもっとうまくいくはずだと思います。そうでない場合はお知らせください。何か間違ったことを書いた可能性があります。残念ながら、今はテストできません...

[編集]

また、生成された SQL を確認したい場合は、「explain」メソッドを使用して、クエリの最後に追加し、たとえばクエリで結果を出力するだけです。

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}}).explain
于 2012-05-01T09:55:52.483 に答える