2013-03-25 82 views
2

我有一个名为“SessRequest”的模型,其中包含字段“sess_start”(会话的开始日期时间)和“sess_duration”(会话持续时间以小时为单位)。因此,会话的结束时间为:sess_start + sess_duration.hours 我需要过滤掉所有“end_time”落后于当前时间的会话。 对于此相应的模型范围看起来像以下:Rails 3范围查询

SESSION_ASSUMED_PAST_AFTER_HRS = 3 
    scope :past, 
    lambda{where('(sess_start < :current_time) AND (sess_start IS NOT NULL)', :current_time => 0.days.from_now - SESSION_ASSUMED_PAST_AFTER_HRS.hours)}; 

我要让基于“sess_duration”数据库字段,而不是常量SESSION_ASSUMED_PAST_AFTER_HRS这个范围。 如何做到这一点,同时仍然保持数据库不可知性?

回答

1

您可以使用squeel gem来创建复杂的SQL查询和各种RDBMS系统。

你的代码看起来像:不是恒定SESSION_ASSUMED_PAST_AFTER_HRS

SESSION_ASSUMED_PAST_AFTER_HRS = 3 
scope :past, where { (sess_start < SESSION_ASSUMED_PAST_AFTER_HRS.hours.ago) & (sess_start != nil) } 
+0

但是,我需要使用提交的同桌“sess_duration”。 – Munish 2013-03-25 10:04:02

+0

有没有任何标准的做法,而不使用任何外部宝石? – Munish 2013-04-01 02:26:28

+0

也许你不能这样做,保持数据库不可知 – kr00lix 2013-04-01 04:21:00