0

宝石のacts_as_listを使用してリストを並べ替えたいと思いました。

しかし、関連付けベースよりも制限されたクエリを処理していないようです (関連付けとブール属性が に設定されたオブジェクトの両方に基づいてリストを並べ替えたいtrue)。

私が間違っていなければ、ログを見ると、gem が同時に多くのレコードを更新する SQL ステートメントを使用しているように見えます。

まったく同じステートメントを使用して、独自のカスタム注文コードを因数分解したいと考えています。

次の 2 つのステートメントは、質問オブジェクトを 3 位から 8 位に移動しています。

UPDATE "questions" SET position = (position - 1) WHERE ("questions"."question_list_id" = 2 AND position > 3 AND position <= 8)
UPDATE "questions" SET "position" = ?, "updated_at" = ? WHERE "questions"."id" = 55  [["position", 8], ["updated_at", "2014-06-09 14:40:47.545040"]]

ActiveRecord またはその他の方法で可能ですか? もしそうなら、どのように上記のコードを再利用できますか?

4

1 に答える 1

1

これらの SQL ステートメントを実現するために、SQL と ActiveRecord を混在させることができます。それらは次のように記述できます。

Question.where(question_list_id: 2, position: [4..8]).update_all('position = (position - 1)')
Question.update(55, position: 8)

act_as_list gem は要素のソートを担当せず、要素の位置を DB に保持するだけです。act_as_list が提供する API を使用して要素をソートするのは、あなた次第です。

一部の要素のみをターゲットにする場合のscopeオプションもあります。ソースを参照してください。

于 2014-06-09T16:36:30.607 に答える