Rails - 自定义模型方法条件

时间:2014-03-19 10:39:31

标签: ruby-on-rails-3 rails-activerecord

我的模型上有自定义方法,我想在where条件下使用它,我已经完成了自定义方法的排序,但无法找到自定义条件下搜索的方法。

现在我有了这个,在我的模特中

attr_accessible :end, :start
def time_left
  self.end.to_i - Time.now.utc.to_i - Time.now.utc_offset
end
def time_left_to_start
  self.start.to_i - Time.now.utc.to_i - Time.now.utc_offset
end
def status
  if self.time_left_to_start > 0 
    1 #proximamente
  elsif self.time_left_to_start < 0 and self.time_left > 0
    2 #funcionando
  else
    3 #finalizado
  end
end

和我的控制器

def index
  @next_events = Event.all.sort_by(&:time_left).reverse!.reject { |e| e.status != 1 }.take(5)
end

我知道我可以在where方法上写下整个条件,但我的想法是不要重复我的自我并避免循环所有事件以删除状态不是1的每个事件,我只需要每次最后5次并且看起来对我来说真的很糟糕,每次都要向db请求所有记录。 在此先感谢,问候!

1 个答案:

答案 0 :(得分:1)

重构我的代码后,我遇到了这个

  def time_left
    (self.end - Time.now).to_i
  end
  def time_left_to_start
    (self.start - Time.now).to_i
  end

  def status
    if self.start  < Time.now and self.end > Time.now
      1 #En curso
    elsif self.start  > Time.now
      2 #Proximamente
    else
      3 #Finalizado
    end      
  end

  def self.status(status)
    if status == 1 #eventos en curso
      where("(events.start < ?) AND (events.end > ?)", Time.now, Time.now)
    elsif status == 2 #proximos eventos
      where("events.start > ?", Time.now)
    elsif status == 3 #eventos finalizados
      where("events.end < ?", Time.now)
    elsif status == 4 #eventos proximos y en curso
      where("events.end > ?", Time.now)
    end
  end

并进行此类查询

  @next_events = Event.status(2).order('events.start DESC').reject { |e| e.time_left_to_start > 12.hour }.take(18)

感谢您的时间,问候!