我目前正在将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
过滤。
提前致谢。
答案 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