Rails 3.如何通过虚拟属性执行“where”查询?

问题描述:

我有两种模式:ScheduledCourse和ScheduledSession。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是一个虚拟的属性

@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 

你不能对不在数据库列执行SQL查询。如果您打算对其进行查询而不是伪造的列,则应考虑将其制作为真正的数据库列;但如果你想从这个集合中选择项目,你仍然可以这样做。你只需要在Ruby中完成。

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

在控制台中它工作,但在网络应用程序中,它打破了kaminari,我得到了'未定义的方法'current_page'#'' – leonel 2012-03-13 21:01:25

我不知道这是否会由一个子查询(子查询是先找到的最早日期)来解决。如果是这样,也许解决方案here可能有助于指向一个有用的方向...

Veraticus是正确的;您不能在查询中使用虚拟属性。

不过,我觉得你可能只是这样做:

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

它将加入表一起通过匹配的ID,然后你可以看一下“happening_at”专栏,这是你的“start_at”属性真的是。

声明:未经测试,但应该有效。