2009-07-29 3 views
0

私はそれを動作させることができません。Rose :: DB :: Object sort_byなぜ私は期待しているRAND()ですか?

my $user_questions 
    = RoseDB::UserSecurityQuestion::Manager->get_user_security_questions(
     query  => [ 
          'user.username' => $username, 
         ], 
     with_objects => ['User','SecurityQuestion'], 
     sort_by  => 'RAND()', 
     limit  => 2, 
    ); 

私はローズ:: DB ::オブジェクト:: Managerのデバッグをオンに、私は順序句があることを参照してください:

ORDER BY t1.id, RAND() 

はどこt1.idをということで、私はこのクエリを使用していますから来る?そして、どのようにしてORDER BYRAND()に修正することができますか? documentation for the sort_by parameterから

答えて

3

関係「多くの多くの」「多くの1つ」を介して関連している(require_objects又はwith_objectsを介して)サブオブジェクトを選択する場合や、ソート順句の最初の条件は、である必要がありますプライマリテーブルの列(t1)。この条件が満たされない場合は、主キー列のリストが自動的にソート順句の先頭に追加されます。

これは、サブオブジェクトを親オブジェクトに正しく関連付けるために必要です。

この動作を無効にする場合は、(まだ未確認の)no_forced_sort論理パラメータを使用できます。

my $user_questions = 
    RoseDB::UserSecurityQuestion::Manager->get_user_security_questions(
    ... 
    sort_by  => 'RAND()', 
    no_forced_sort => 1); 

しかし、サブオブジェクトが正しくない親オブジェクトに関連付けされるようになります可能性が高いです。この作業をするために必要なものは、決定的にt1の固有の特性に基づいているソートですが、そうでなければランダムです。つまり、somefunc(t1.id)はランダムですが、t1.idの与えられた値に対して常に同じ結果を返し、すべての子を正しい親に保ちます。ランダムに今、あなたはあなたの(最大)を持っている

my $user_questions = 
    RoseDB::UserSecurityQuestion::Manager->get_user_security_questions(
    query  => [ 'user.username' => $username ], 
    with_objects => ['User','SecurityQuestion']); 

use constant NUM_RANDOM_QUESTIONS => 2; 

my @questions; 

for(1 .. NUM_RANDOM_QUESTIONS) 
{ 
    last unless(@$user_questions); 
    push(@questions, splice(@$user_questions, int(rand(@$user_questions)), 1)); 
} 

NUM_RANDOM_QUESTIONS

明らかに(そしておそらく多くの実用的)なアプローチは、ユーザー$usernameのすべてのセキュリティ質問をフェッチしてからちょうど無作為に2つを選択することです選択した質問は@questionsです。

+0

ありがとうございます。私があなたの仕事に掘り下げるほど、私はそれを高く評価します。最大5つの質問があるので、この場合はアプローチが受け入れられると思います。たぶん一日私は完全にモジュールですべてを得るだろう(しかし、多くを耕す:) – cliveholloway

関連する問題