2

私はユーザーモデルを持っています

default_scope :order => 'created at desc'

現在、ID 1 から 50 までの 50 のレコードがあります。

User.first戻りますUser id: 50

User.first(2)リターンUser id: 50User id: 49

User.last戻り値User id: 1

これはすべて理にかなっています。でも、

User.last(2)User id: 49User id: 50をこの順序で返します。何故ですか?そして、どうやって返すUser id: 1User id: 2ですか?

4

3 に答える 3

3

これはよくある間違いです。User.last(1)User.last()まったく同じではありません。User.last(1)単一のレコードの配列を提供し、User.last()そのレコード オブジェクトを返します。

default_scope繰り返しますが、 User モデルにがある場合、これらのメソッドは両方ともまったく異なる動作をします。

User.lastデフォルトのスコープで動作し、その順序を逆にします。したがって、それが起動する SQL クエリは次のとおりです。

SELECT * FROM users ORDER BY created_at ASC LIMIT 1

一方、User.last(1)は書き込みに似ていUser.order('id desc').limit(1)ます。そしてdefault_scope、実際に行動order by id descすると、デフォルトのものに次ぐものになります。したがって、起動する SQL は次のようになります。

SELECT * FROM users ORDER BY created_at desc, id desc LIMIT 1

したがって、ここで本当に必要なことは、Kien が述べたように、デフォルトのスコープを削除するUser.unscopedことです。個人的には、デフォルトのスコープ順序を使用せず、代わりに明示的なスコープを使用します。

于 2012-12-02T07:05:59.410 に答える
1

方法を試してくださいunscoped

User.unscoped.first(2) # Get User id=1 and id=2

[すべてのスコープを削除]をオンにすることができます。

于 2012-12-02T02:20:53.913 に答える
1

Rubydocsは最初と最後のメソッドに関する情報を提供します。

last(2) が機能しない場合は、試すことができます

User.find(:order => 'created_at asc', :limit =>2)

訂正

User.find(:all,:order => 'created_at asc', :limit =>2)  
User.unscoped.order('created_at asc').limit(2)

必要なものを取得するために、そこに多くの引数を渡すことができます。

于 2012-12-01T16:48:06.653 に答える