Rails范围/类方法选择虚拟属性

时间:2014-05-01 23:26:17

标签: ruby-on-rails activerecord kaminari scopes

我目前正在将has_scope gem与模型上的范围/类方法结合使用,以过滤返回到我的UI的结果集。

我有一个模型Task我希望能够按status过滤 - 模型上的虚拟属性。

Task模型有一些您可能需要了解的属性

uuid: Generated by SecureRandom
running: A boolean
success: A boolean
started_at: DateTime

status计算如下:

def status
    if running?
        'Running'
    elsif started_at.nil?
        'Queued'
    elsif success?
        'Finished'
    else
        'Failed'
    end
end

忽略这可能不是理想的做法,我目前已经实现了status过滤方法,如下所示:

def self.by_status(status)
  records = all.select {|s| s.status == status}
  where(uuid: records.map(&:uuid))
end

我无法仅返回select的结果,因为它的类型为Array,而不是ActiveRecord::Relation,因此我的where hackery。对于上下文,我不能/不想返回数组的原因是结果集被传递给kaminari以进行分页。

请注意:我目前使用的方法符合我的要求,但我不喜欢它的方式。我觉得应该有更好的方法。

有人建议使用更好的by_status方法返回ActiveRecord::Relation吗?

TL; DR: 需要一个类方法来返回虚拟属性的ActiveRecord::Relation过滤。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我将如何做到这一点

def self.by_status(status)
  case status
  when 'Running'  then where(running: true)
  when 'Finished' then where(success: true)
  when 'Queued'   then where(started_at: nil)
  else scoped #change this to all in Rails 4 since Model.all returns an AR Relation
  end
end