74687
### やりたいこと

すでにいくつかDBにレコードが登録されているとして、その途中にひとつレコードを挿入し、かつ、idはよしなに並べ替えてくれるみたいなことがしたいです。

### 具体例

下記のようなusersテーブルがあったとして、主キーであるidが1と2の間にレコードを挿入したい、かつ、idもうまいことずらしてくれる。  
みたいなことを想定しています。

```

    |id|name|
    |1 |fuga|
    |2 |hoge|
    |3 |piyo|
    
```

(挿入後)

```

    |id|name|
    |1 |fuga|
    |2 |fizz|  <=== 挿入する, hogeのidは3に、piyoのidは4にする
    |3 |hoge|
    |4 |piyo|
    
```

### 考えたこと

upsert_allを使えばレコード自体の更新はできるものの、idの並び替えがどうやってやればいいのか分からず、何かヒントになるメソッドや方法を知っている方がいらっしゃいましたら教えていただけると助かります。よろしくお願いします。
CC BY-SA 4.0
2021-03-14T09:26:52.510
74670
2021-03-15T19:33:48.917
2021-03-15T19:33:48.917
43337
question
ruby-on-rails
RailsでDBにレコードを途中挿入したい
Wikipedia英語版[Primary key](https://en.wikipedia.org/wiki/Primary_key)より:

> (前略) In the
> [ORM](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) like
> [active record
> pattern](https://en.wikipedia.org/wiki/Active_record_pattern), these
> additional restrictions are placed on primary keys:
>
>   * Primary keys should be immutable, that is, never changed or re-used;
> they should be deleted along with the associated record.
>

>
> (後略)

ORMapper が暗に `id` のような人工キー(surrogate
key)を主キーとして要求しているのは、主キーの不変性を保証することで、レコードのコントロールを容易にするためです。

したがって、人工キーを主キーに設定しているにもかかわらず変更したい、という質問文の要求は奇妙であり、目的達成のために行おうとしている手段を誤っているのではと考えます。

質問文中に目的が書かれていないので明確に回答はできませんが、 `id` 以外のカラム(例えば`ソーオーダー`)で実現すべきものかと思います。  
この場合、例えば次のリンクのような設計を行うことで、既存のレコードの値を更新することなく、既存のレコードの間に新規レコードを差し込めるかと思います。

  * [RESTful な並び替え実装の個人的ベストプラクティス](https://qiita.com/gypsy/items/7bd2a4aeb1b419ce8914) \- Qiita
CC BY-SA 4.0
2021-03-15T16:59:02.997
74687
2021-03-15T16:59:02.997
2808
74670
answer