私は現在has_scope
、モデルのスコープ/クラス メソッドと組み合わせて宝石を使用して、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
kaminari
注:現在使用している方法は私の要件を満たしていますが、その方法が好きではありません。もっと良い方法があるべきだと感じています。
by_status
を返すためのより良い方法を提案できる人はいActiveRecord::Relation
ますか?
ActiveRecord::Relation
tl;dr:仮想属性のフィルタリングを返すクラス メソッドが必要です。
前もって感謝します。