5

私のアプリには、ユーザー (franceusers、belgiumusers、...) 用のテーブルがいくつかあり、table_name_prefix と table_name で試したドメインに応じていずれかを使用したいのですが、うまくいかないようです

class User < ActiveRecord::Base
rolify
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable, #:confirmable,
:recoverable, :rememberable, :trackable, :validatable

def self.table_name
debugger
'franceusers'
end

def self.table_name_prefix
debugger
'france'
end
end

デバッガーのおかげで、それが呼び出されていることがわかりますが、self.table_name_prefix は呼び出されていません。また、self.table_name が呼び出された場合でも、franceusers ではなくテーブル users でユーザーを検索するように工夫してください

コンソールで User.table_name => "franceusers"

User.table_name_prefix => "フランス"

さらに奇妙なことに、私もactiveadminを使用しています。ユーザーリストを参照すると、エラーが発生します: Mysql2::Error: Unknown column 'franceusers.id' in 'order clause': SELECT users.* FROM users ORDER BY franceusers.id descリミット 30 オフセット 0

フィールドの table_prefix を見つけることはできますが、FROM を見つけることはできないようです。

私は何か悪いことをしますか?ユーザーのテーブル名を変更する別の方法はありますか? 上司の指示であるため、すべてのユーザーテーブルを1つに結合することはできません:-s

ありがとう

4

1 に答える 1

0

さまざまなタイプのユーザーがいて、それぞれが異なるデータベースに存在する必要があるという上記の要件がある場合は、おそらくそれぞれのユーザー クラスを作成するだけです (100 ではなく 5 ~ 10 のユーザーを想定しています)。

FranceUser と SpainUser などを用意します。次に、各クラスに含めることができるモジュールに共通のデバイス ロジックを抽出します。また、さまざまなテーブルを結合して正しいユーザーを検索できるようにするには、login/register/etc コントローラーをオーバーライドする必要があります。また、複数のデータベース テーブルにまたがる電子メールの一意性制約などを実装する必要があります。基本的に、それは非常に悪い考えのように聞こえます。それ以外の場合はdeviseで無料で取得できる多くの作業を行う必要があります.

それは実行可能ですが、上司がデータを複数のテーブルに分割するためにどのようなユースケースを持っているかを調べ、問題を解決するためのより良い方法を見つけることをお勧めします. 簡単に報告したいという単純なことかもしれませんが、devise を使用してその機能の半分をオーバーライドするよりも、これらの問題を解決するためのはるかに単純で洗練された方法があります。

幸運を :)

于 2015-07-02T22:00:51.787 に答える