2


独立ActiveRecordのクエリは

class User < ActiveRecord::Base 
    def self.all_users_count 
    User.all 
    end 
end 

User.all_users_count
リターンは、例えば、

User.limit(5).all_users_count
今ではを返すレールコードにいくつかのルビーがあります5のため、ActiveRecord :: Relationコンテキストのため、クラスだから、User.all代わりに、単純なall
(そのクエリは、常に他の例でlimitまたはwhere idまたは他のものが含まれて表示さ.to_sql)

は、どのように私は、モデルのメソッド内のコンテキストに依存しないARクエリを作ることができますか? User.allなどのように?

ありがとうございました!

ps。または、おそらく私のコードにこのようなエラーや何かがあり、実際にはUser.allはメソッド内にあり、コンテキストは常にこのモデルテーブルの正しい行数を返す必要があります

答えて

1

これは非常に奇妙で予期しない私のコンピュータが墜落して手元にレールプロジェクトがないからです)。

私は(あなたがそれを呼び出すようか - コンテキスト)を新しいスコープを作成する

User.all 

を期待

User.unscoped.all 

を編集してこの問題を回避作業をしてみてください。

私は私のプロジェクトとクリーンレールレポで試してみました。結果は一貫しています。

少し考えてみても、これは問題ではないかもしれません。あなたのアプローチが間違っていると思います。

どのようなシナリオであなたはチェーンUser.limit(2).all_users_countでしょうか?私は何も考えることができません。そのチェーンのall_users_countを呼び出すにはポイントがありません、それは - ?あなたは、すべてのユーザーがcoundする必要があり、あなたがUser.all_usert_count(または単にUser.count)を呼び出す

...またはあなたが何か他のものを必要とし、あなたがUser.limit(2).where(...)を呼び出すいずれかのため、

そして、あなたがそれを考えるとき、意味があります。あなたがcount_retiredのようないくつかの異なる方法を持っていたとしたら、そのような呼び出しから何を期待しますか?

User.limit(2).count_retired

2人以上の退職者、または退職したすべてのユーザーの数は、システム内では何人ですか?私は前者を期待する。

は、だから私はここでは二つの可能性の一つだと思う:

  • いずれか
  • (編集セクションで説明したように)あなたの実装、それは間違っている、と叫びは別の方法でそれを行うか、いくつかのより多く持っています複雑な問題ですが、あなたの事例は、もう意味をなさないところまで煮詰めました。(喜んでいただければ別の質問でフォローアップしてください。そうすればリンクしてコメントに私にpingしてください。面白い)
+0

**はい、それは、thanx!**私は "contex 「t」と「scope」と他のものと私の状況について何かを見つけることができません。私は似たような方法があると思っていましたが、Googleのためにこの問題を定式化するのは難しいです。 Ps。はい、私は同意します、それは予想外の動作ですが、それは..少なくとも私の場合は – dmitryck

+0

UPDです。 'unscoped'は単純なケースでうまくいきますが、クエリがより大きく、他の宝石のモデル(クロージャツリーのようなもの)に多くのメソッドが適用されているとき - サマリーSQLクエリにはまだいくつかの追加条件があります。 .. ok、非常にマッチしてくれてありがとう! – dmitryck

+0

これは奇妙で紛らわしいものですが、作業するためのいくつかのレールプロジェクトがあるときは、これを必ず調査します。 – meta