質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

1回答

1453閲覧

rails 新しくカラムを追加した時の既存データの扱いについて

keiiti

総合スコア29

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

0クリップ

投稿2020/09/20 06:22

こんにちは!
いつも誰かに助けてもらいながら開発を進めています。
今回、タイトルにあるように、既存のデータの扱いについて教えていただきたく質問します。

前提・実現したいこと

質問に至った経緯
色々なユーザーが記事を書ける、ブログサイトのような物を作成しています。
記事(Post)の詳細 posts#showのページにアクセスした時にURLがXXX/posts/idと表示され
これはダサいと思いランダム化を調べてみました。

public_uidというgemを紹介している記事を見つけ、実装し、XXX/posts/(ランダムな文字列)にすることができたのですが、
既に、作成されている記事達にはpublic_uidはnilです。

PostsControllerでは

@post = Post.find(params[:id]) ↓ @post = Post.find_by(public_uid: params[:public_uid])

のように変更しています。
そうすると、既に作成されていた記事達は参照できなくなり、アクセスできません。

実現したいこと
DBresetをせずにこの問題を解決したい。

考えたこと
・public_uidがない記事については、今まで通りのfind(params[:id])を参照するような条件分岐
・既にあるデータに手動でランダムな文字列を打ち込む
・既存のデータにもpublic_uidを割り当てる

どのようにするのが良いのかわからなくなり、質問しました。
考え方や参考になるサイトや方法をご存知の方、教えてくださいませ!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

冪等なバッチを作って、Rails Runner で実行するのが良いですね

どこでもいいのですが、まあ /script/ 直下に xxx.rb みたいなファイルを作成して、

# /script/xxx.rbの中身 posts = Post.all posts.find_each do |post| <public_uid に値を追加する処理> if post.public_uid.nil? end

rails r /script/xxx.rb で実行すると良いですよ????

投稿2020/09/20 06:45

s4na_penguin

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keiiti

2020/09/22 10:37

アドバイスありがとうございます! public_uidに値を追加する処理というのは 例えば、10個既にデータがあるとしたら10個分手動入力の値を打ち込むという認識で良いでしょうか?
s4na_penguin

2020/09/22 12:38

どういうので uidを追加しているのかわかりませんが、もしgemならドキュメントに追加するメソッドなりが書いてあるんじゃないでしょうか? ``` posts.find_each do |post| # ???? ここ end ``` は find_eachでpostのデータ一つを取得しているので、uidを作成する処理を追加すれば、自動でループします???? 例えば、 ``` posts.find_each do |post| post.public_uid = 1if post.public_uid.nil? end ``` とすれば全部 1 入ります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問