0

Ruby 1.8.7 を使用して Rails 2 アプリケーションのメンテナンスを行っています。will_paginate を使用しています。

次の問題があります: current_user.products.paginate(:page => 1, :order => " updated_at asc ") を呼び出すと、製品の updated_at プロパティに基づいて、期待どおりに注文されます。

ただし、 current_user.products.paginate(:page => 1, :order => " released_at asc ") を呼び出すと、release_at で期待どおりに注文されません。実際、「asc」または「desc」のどちらに従って順序付けを行うように指定しても、同じコレクションが返されます。

updated_at とreleased_at はどちらもモデルで定義された属性で、データベースに存在し、すべての値は null ではありません。モデルに default_scope が定義されていません。

これを引き起こしている原因と、これを修正する方法を教えてください。

以下に Desc 製品を追加します (簡潔にするために、関連するフィールドのみをリストしています)。

| | フィールド | フィールド タイプ | ヌル | キー | キー | デフォルト | エクストラ |

| | リリースされた_at | 日時 | はい | | | ヌル | | |

| | updated_at | 日時 | はい | | | ヌル | | |

4

2 に答える 2

1

Product モデルは、released_at 属性も定義するモデルから継承します。release_at のメソッドは Ruby on Rails コードでオーバーロードされているため、Product のインスタンス プロダクトで product.released_at を呼び出すと、実際には親モデルのreleased_at 値が呼び出されます。その結果、Rails コンソールからは、released_at が null ではなく、値が含まれているように常に見えます。

ただし、データベースを直接見ると、Product モデルで release_at が null であることがわかります。そのため、will_paginate リクエストは正しく通過しても、値がすべて同じ (null) であるため、順序付けは行われません。updated_at 属性に対してまったく同じクエリが実行された場合、その属性は null ではないため、並べ替えが機能します。MySQL で直接ではなく、Rails Console から空の値をチェックしたため、これを見逃していました。

私の解決策は、親モデルの値に基づいてソートする Product モデルで named_scope を定義することでした。次に、名前付きスコープで paginate 関数を呼び出します。

于 2012-06-04T09:44:48.387 に答える
-1

場合によっては、フィールドを並べ替えるためにインデックスを定義して機能させる必要があります。

于 2012-05-31T12:02:03.010 に答える