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

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

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

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Q&A

解決済

1回答

1769閲覧

railsで後からid以外のカラムをprimary_keyに設定したい

NN77

総合スコア60

Ruby on Rails 5

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

0グッド

0クリップ

投稿2020/01/26 08:19

編集2020/01/26 08:21

今回の変更を行ないたい背景

・heroku+clear dbの組み合わせで本番公開をしている施設検索のアプリケーションがあります。
・以下のようなclear dbの仕様により、施設テーブル(テーブル名:nurseries カラム名id・name・city_id)と市区町村テーブル(テーブル名:cities カラム名:id・city_name)が開発環境の通りheroku上で紐づかず難儀しています。

herokuでmysql(ClearDB)を使うとidが10ずつ増える

例:
開発環境で施設Aはid:2の千代田区と紐づくが、
そもままdeployすると施設Aの所在地がid:12の新宿区に変わってしまう。

実現しようとしていること

primary_keyを主キー以外に設定する方法があることを知り、
以下のような変更で上記事態を回避しようとしていますが、
このような方法最適なのかが不安で書きこませていただきました。
こういった場合の対処法として、以下のような対応で問題はないのでしょうか。

■cityテーブルにプライマリーキーにしたいカラム(primary_id)を新たに追加するmigrationファイルを作り実行する。

class AddPrimaryIdToCities < ActiveRecord::Migration[5.2] def change add_column :cities, :primary_id, :integer, comment: "主キー" end end

■cityクラスでprimary_idがプライマリーキーであると定義する

class City < ApplicationRecord has_many :nurseries # プライマリキーとして設定するカラム名を定義する self.primary_key = "primary_id" validates :primary_id, presence: true validates :primary_id, uniqueness: true end

<参考にした記事>
【Rails】id以外のカラムをプライマリキーに設定する方法

データベースにindexを張る方法

よろしければアドバイスのほどお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

それで行けますが、、、、
rails4での経験ですが、時に id が顔を出すことがあって障害になり、idが顔を出しているんだと気がつくまでに時間を費やしたトラウマがあります。

以降、
tableとしてのprimary_keyは触らず、関連付けにおいて 指定する という方法にしています。

が、、、
本件はなにか根本が違う気がします。
id が 2 であろうと 12 であろうと、それが 千代田区 になるように作れば良いのです。
千代田区であると指定するときに id を決め打ちしていませんか?
千代田区 の idはいくつだ?と探してそれを入れるようにすれば良いと思うのですが。

投稿2020/01/26 09:28

winterboum

総合スコア23509

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

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

NN77

2020/01/26 11:21 編集

早速ありがとうございます。 >時に id が顔を出すことがあって障害になり、idが顔を出しているんだと気がつくまでに時間を費やしたトラウマがあります。 こんなことが発生するのですね。。 >千代田区であると指定するときに id を決め打ちしていませんか? まさにこのようにしています。 施設ごとに、area_id・prefecture_id・city_id・station_idを決め打ちしており、 areas prefectures cities stationsのテーブルを別で保持しています。 1対多の関係なので中間テーブルをもつものでもないと思ってこうしていましたが 「千代田区 の idはいくつだ?と探してそれを入れるようにすれば良いと思うのですが。」 とするには、上のような状態からどのように改変をかけると良いでしょうか・・・ 別の質問になってしまっており申し訳ありません。
winterboum

2020/01/26 11:39

市区町村のマスターテーブルを用意し、selectで指定するなどしてtableからidを得るようにするのが良くやる方法です。 市区町村のテーブルは、総務省だったかな辺りが 都道府県codeと共に市区町村codeを定義していますので、そこを参考にするのが良いかと。 idではなくcodeで関連つけるという方法もあります。 これもマスターは必要です。
winterboum

2020/01/26 11:41

codeで関連つける 場合は、市区町村code欄を用意し、 市区町村idから変換するワンショットのscriptを流せばよいです。
NN77

2020/01/26 14:01

ありがとうございます。heroku利用により変更のかからないcodeを利用して関連づける方法に変更しようと思います!そもそもの設計に問題があることがよくわかりました。修正を進めます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問