2012-03-13 7 views
2

私は、ScheduledCourseとScheduledSessionという2つのモデルを持っています。Rails 3.仮想属性による「where」クエリの実行方法は?

scheduled_course has_many scheduled_sessions 

scheduled_session belongs_to scheduled_course 

ScheduledCourseが仮想属性を持っている...

def start_at 
    s = ScheduledSession.where("scheduled_course_id = ?", self.id).order("happening_at ASC").limit(1) 
    s[0].happening_at 
end 

... start_at仮想属性がScheduledCourseに属し、それは最古のものを選び、すべてのScheduledSessionsをチェックします。したがって、start_atは、最初のセッションが発生した日付です。

私はコントローラに書き込む必要がありますので、今日始まったレコードだけを入手して、将来に行くことができます。また、私は過去のコースだけを取得する別のクエリを記述する必要があります。

start_atはあなたがデータベースにない列にSQLクエリを実行することはできません仮想属性

@scheduled_courses = ScheduledCourse.where('start_at >= ?', Date.today).page(params[:page]) 

@scheduled_courses = ScheduledCourse.where('start_at <= ?', Date.today) 

SQLite3::SQLException: no such column: start_at: SELECT "scheduled_courses".* FROM "scheduled_courses" WHERE (start_at >= '2012-03-13') LIMIT 25 OFFSET 0 

答えて

3

あるので、私は次の操作を行うことはできません。偽の列の代わりにクエリを実行する場合は、これを実際のデータベース列にすることを検討する必要があります。このコレクションからアイテムを選択したい場合でも、このコレクションを選択できます。あなたはRubyでそれをしなければなりません。

ScheduledCourse.page(params).find_all {|s| s.start_at >= Date.today} 
+0

コンソールでは動作しますが、Webアプリケーションでカミナリが壊れてしまい、#の 'current_page 'メソッドが未定義です – leonel

1

サブクエリ(サブクエリが最も早い日付を最初に見つけている)によって解決されるのだろうかと思います。もしそうなら、恐らく解決策hereは有用な方向を指す助けになるかもしれません...

3

ベラカスは正しいです;クエリで仮想属性を使用することはできません。

しかし、私はあなただけで行うことができると思う:

ScheduledCourse.joins(:scheduled_sessions).where('scheduled_courses.happening_at >= ?', Date.today) 

それはIDを照合することによって一緒にテーブルを結合し、その後、あなたは何をあなたの「start_at」属性は「happening_at」列、で見ることができます本当にです。

免責事項:未テストですが、動作するはずです。

関連する問題