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

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

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

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

Q&A

解決済

1回答

748閲覧

Userモデルのtable_nameに間違ったテーブル名が設定されてしまう。(Rails6系)

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 6

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

1グッド

1クリップ

投稿2021/04/13 14:34

編集2021/04/16 10:31

事象

devise + devise_token_authを利用してUserモデルを作成しました。(数ヶ月前)

直近でUserモデルを触ろうとしたところ、継承元がApplicationRecordではなくなぜかActiveRecord::Baseになっていました。

手動で継承元をApplicationRecordに変更してfindなどを実行してみるとエラーが出て、
クエリのテーブル名の指定がおかしかったので、コンソールでUser.table_nameを確認するとテーブル名が「userusers」になっていました。

内部スタッフ用にStaffというロールのテーブルも別名モデルであるのですが、そちらでも同じ事象が発生していました。

継承元をActiveRecord::Baseに修正すると問題無くなります。

他のモデルに関しては問題ありません。

補足

  • githubのblameで確認したところ、Userモデル作成時から継承元がActiveRecord::Baseになっておりました。記憶にないですがdevise gnerateコマンドで作成したはずです。
  • config系のファイルは特におかしなところはなさそうです。

コード

Ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are:, :confirmable, 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, :recoverable, 5 :rememberable, :validatable, :trackable 6 include DeviseTokenAuth::Concerns::User 7end

ruby

1# Gemfile.lockからdevise関連のとこのみ抜粋 2 devise (4.7.3) 3 bcrypt (~> 3.0) 4 orm_adapter (~> 0.1) 5 railties (>= 4.1.0) 6 responders 7 warden (~> 1.2.3) 8 devise_token_auth (1.1.5) 9 bcrypt (~> 3.0) 10 devise (> 3.5.2, < 5) 11 rails (>= 4.2.0, < 6.2)
shinoharat👍を押しています

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

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

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

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

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

shinoharat

2021/04/26 04:06

ApplicationRecord も質問文に追加お願いします。
guest

回答1

0

ベストアンサー

きちんとした回答ではないので遠慮してましたがまだ回答がないようなので。

class ApplicationRecord を読めばわかりますが、ApplicationRecord と 
ActiveRecord::Base はほぼ同じものです。
ので、その違いは気にしないで良いです。
devise gnerate で ActiveRecord::Base で作られるのは、ApplicationRecordになにか定義がされてそれがDeviseと鑑賞するのを恐れているのではと考えています。
きちんとした回答ではないのは、ApplicationRecord にするとなぜtable名が変わってしまうのか、という知見はないので。

投稿2021/04/29 08:00

winterboum

総合スコア23284

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

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

退会済みユーザー

退会済みユーザー

2021/05/08 15:35

ご連絡遅くなり申し訳ありません。 こちらですが自己解決しまして、自分で使う用にApplicationRecordにtable_name_prefixやclass_name_prefixといったメソッドを定義していたのですが、名前被ってオーバーライドしてた見てたみたいです、、 ActiveRecord::ModelSchemaみたいなモジュールで使われてて、多分テーブル名をセットする時に使われてた様なので、多分これのせいでした、、 すみませんでした、、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問