我在rails上使用方法作为查询列。
我的模型看起来像这样:
class CourseDate < ActiveRecord::Base
belongs_to :course, touch: true
validates :date, presence: true
validates :start, presence: true
validates :end, presence: true
def start_datetime
DateTime.new(date.year, date.month, date.day, start.hour, start.min, start.sec, start.zone)
end
end
我想要做的是这样的事情:
CourseDate.where("start_datetime > ?", Time.now)
此查询返回:column "start_datetime" does not exist
有没有办法实现这个目标?
答案 0 :(得分:1)
您无法查询ruby方法,因为它不存在于数据库中。
我会删除日期列并从开始列派生日期。
然后,您可以查询start CourseDate.where("start > ?", Time.now)
,知道它包含正确的日期和时间。
class CourseDate < ActiveRecord::Base
belongs_to :course, touch: true
validates :start, presence: true
validates :end, presence: true
end
另一种方法是添加一个名为start_datetime
的日期时间列,并使用上面before_save
方法中的逻辑设置回调值:
class CourseDate < ActiveRecord::Base
belongs_to :course, touch: true
validates :date, presence: true
validates :start, presence: true
validates :end, presence: true
before_save :set_start_datetime
private
def set_start_datetime
self.start_datetime = DateTime.new(
date.year,
date.month,
date.day,
start.hour,
start.min,
start.sec,
start.zone
)
end
end
CourseDate.where("start_datetime > ?", Time.now)
现在可以使用了。
答案 1 :(得分:1)
PostgreSQL支持date + time
(doc),因此您可以像这样编写查询:
CourseDate.where('"date" + "start" > ?', Time.now)
答案 2 :(得分:0)
对于您提到的用例,您最好运行CourseDate.where start > NOW()
。请注意,这将使用运行数据库服务器的任何时区。