4

Rails 3.2.8 と ruby​​ 1.9.3p194 を実行しています。

がどのように存在するのかを正確に理解しようとしていますか? メソッドはアクティブレコードで機能します。理解できない奇妙な結果が得られます...わかりやすくするために、ここでコードを単純化します。

ユーザーのリストを持つ User モデルがあるとします。

1 アンディ、m
2 ジェイク、m
3 キャシー、f
4 マイク、m

男性用のスコープがあるので、次のようにします。

User.male => [#< User id: 1, name: Andy, gender: male>, #< User id: 2, name: Jake, gender: male>, #< User id: 4, name: Mike, gender: male>]

わかった。今:

a = User.find 1 => #<User id: 1, name: Andy, gender: male>  
b = User.find 2 => #<User id: 2, name: Jake, gender: male> 
c = User.find 3 => #<User id: 3, name: Cathy, gender: female> 
d = User.find 4 => #<User id: 4, name: Mike, gender: male> 

User.male.exists?(a) => true  
User.male.exists?(b) => true  
User.male.exists?(c) => false  
User.male.exists?(d) => true  

それは理にかなっています。でも:

User.male.limit(1) => [#<User id: 1, name: Andy, gender: male>]

User.male.limit(1).exists?(a) => true  
User.male.limit(1).exists?(b) => true  
User.male.limit(1).exists?(c) => false  
User.male.limit(1).exists?(d) => true  

exists?(b) と exists?(d) が true を返すのはなぜですか? 制限は、まだすべて男性ユーザーであるクエリを実際には変更せず、 limit(1) は単に表示されるためですか? これを購入することはできますが、exists?(a) が true を返し、その他すべてが false を返すようにしたい場合、正しいクエリは何でしょうか?

さて、これは本当に私を完全に混乱させます:

User.male.limit(1).offset(1) => [#<User id: 2, name: Jake, gender: male>]  

User.male.limit(1).offset(1).exists?(a) => false
User.male.limit(1).offset(1).exists?(b) => false
User.male.limit(1).offset(1).exists?(c) => false
User.male.limit(1).offset(1).exists?(d) => false

ここですべてが false を返すのはなぜですか? exists?(b) が true を返すようにしたいのですが、そうでない理由がまったくわかりません。誰かが私を啓発することができれば、私は非常に感謝しています. ドキュメントを調べても無駄でした。

4

1 に答える 1

1

User.malewhere句「gender = male」を追加

.exists?(a)余分な句「id = 1」を追加します

limit 1limit 1where句の後に追加するだけです。

したがって、ユーザーユーザーID男性User.male.limit(1).exists?(a)が生成され ますSELECT 1 FROMWHERE.= 1 AND (gender =) LIMIT 1

動作する理由.exists?(x)は、id を where 句に追加して、関連するレコードを選択するためです。

また、offset(1)を入れたときに一致するレコードが1つしか得られず、exists?(x)それにoffset(1)を追加すると、そのレコードの後に​​レコードを探す必要があるため、これは機能しません。

于 2012-08-24T09:42:06.483 に答える