1

免責事項:私はレールに比較的慣れていません。

モデルにクエリを実行したいカスタム メソッドがあります。「アクティブ?」と呼ばれるメソッドは、ブール値を返します。私が実際にやりたいのは、次の形式の ActiveRecord クエリを作成することです。

Users.where(:active => true)

当然、上記をそのまま実行すると「列が存在しません」と表示されるので、私の質問は次のとおりです。

上記と同等のことを行うにはどうすればよいですか?ただし、実際の DB 列ではなく、モデルのカスタム メソッドの場合はどうすればよいですか?

4

2 に答える 2

2

アクティブを使用する代わりに?メソッドを使用すると、一致するアイテムを見つけるのに役立つスコープが得られます。

このようなもの...

def self.active
  joins(:parent_table).where(:archived => false).where("? BETWEEN parent_table.start_date AND parent_table.end_date ", Time.now)
end

そして、あなたはこれを行うことができるはずです

def active?
  User.active.exists?(self)
end

このスコープをインスタンス テストに再利用する場合。

于 2013-05-22T22:59:13.937 に答える
1

これを行う簡単なselect方法は、既存のモデル メソッドでメソッドを使用することです。

Users.select{|u| u.active}

これは配列を返すため、Active Record Query メソッドを使用することはできません。ActiveRecord_Relation結果をオブジェクトとして返すには、where関数を使用して、一致する ID を持つインスタンスを照会できます。

class User < ActiveRecord::Base

  def self.active
    active_array = self.select{|r| r.active?}
    active_relation = self.where(id: active_array.map(&:id))
    return active_relation
  end

end
于 2019-10-05T20:18:56.367 に答える