ruby on rails - 使用方法作为查询列

时间:2016-05-26 18:09:39

标签: ruby-on-rails ruby

我在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

有没有办法实现这个目标?

3 个答案:

答案 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 + timedoc),因此您可以像这样编写查询:

CourseDate.where('"date" + "start" > ?', Time.now)

答案 2 :(得分:0)

对于您提到的用例,您最好运行CourseDate.where start > NOW()。请注意,这将使用运行数据库服务器的任何时区。