1

私は現在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タイプであるためです。文脈上、配列を返すことができない/返したくない理由は、ページネーションのために結果セットが渡されるためです。ArrayActiveRecord::Relationwherekaminari

:現在使用している方法は私の要件を満たしていますが、その方法が好きではありません。もっと良い方法があるべきだと感じています。

by_statusを返すためのより良い方法を提案できる人はいActiveRecord::Relationますか?

ActiveRecord::Relationtl;dr:仮想属性のフィルタリングを返すクラス メソッドが必要です。

前もって感謝します。

4

1 に答える 1

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
于 2014-05-01T23:46:10.243 に答える