0

これを使用してアクティブなレコードテーブルを更新しています:

  def sort
    params[:piece].each_with_index do |id, index|
      current_user.lineup.piece_lineups.update_all({position: index+1}, {id: id})
    end
    render nothing: true
  end

新しいソート順を実際にDBに保存していないことを除いて、すべてが機能しているように見えます。出力を見ると、すべてが適切に更新されていることがわかります。SQLクエリは次のとおりです。

Started POST "/lineups/sort" for 127.0.0.1 at 2012-06-26 08:07:24 -0700
Processing by LineupsController#sort as */*
  Parameters: {"piece"=>["1", "4", "2", "3", "7"]}
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
  Lineup Load (0.2ms)  SELECT `lineups`.* FROM `lineups` WHERE `lineups`.`user_id` = 3 LIMIT 1
  SQL (0.2ms)  UPDATE `piece_lineups` SET `position` = 1 WHERE `piece_lineups`.`lineup_id` = 4 AND `piece_lineups`.`id` = 1
  SQL (0.2ms)  UPDATE `piece_lineups` SET `position` = 2 WHERE `piece_lineups`.`lineup_id` = 4 AND `piece_lineups`.`id` = 4
  SQL (0.2ms)  UPDATE `piece_lineups` SET `position` = 3 WHERE `piece_lineups`.`lineup_id` = 4 AND `piece_lineups`.`id` = 2
  SQL (0.2ms)  UPDATE `piece_lineups` SET `position` = 4 WHERE `piece_lineups`.`lineup_id` = 4 AND `piece_lineups`.`id` = 3
  SQL (0.1ms)  UPDATE `piece_lineups` SET `position` = 5 WHERE `piece_lineups`.`lineup_id` = 4 AND `piece_lineups`.`id` = 7
  Rendered text template (0.0ms)
Completed 200 OK in 8ms (Views: 0.6ms | ActiveRecord: 1.4ms)

すべてが機能しているように見えますが、そうではありません。私は何が欠けていますか?

4

1 に答える 1

0

申し訳ありませんが、私の答えは間違っていたと思います。あなたのコードは私には正しいようです。なぜ機能しないのかわかりません。しかし、作品の記録を逐一更新していて非効率です。O(n) sql update クエリを生成します。おそらく、これを試すことができます。これにより、1 つの更新クエリが生成されます。

attributes = Hash[params[:piece].each_with_index.map { |id, index| [id, {order: index}] }]
current_user.lineup.piece_lineups.update(attributes.keys, attributes.values)
于 2012-06-27T00:03:19.733 に答える