4

アプリケーション認証にdeviseを使用しています。Userサインイン/アップモデルのモデルを持っています。

この機能は、クライアント、つまりユーザーがサインアップすると、必須のユーザープロファイルページに入力するように設定されています。deviseを使用してすべてが正常に機能しました。

今、私は新しい機能を持っています、ユーザーはさまざまなタイプにすることができます(たとえばA、、)BC

ユーザーのタイプがである場合、ユーザーはA同じサインアッププロセスと同じプロファイルページに従う必要があります。

ユーザーがタイプBの場合、サインアップ画面は異なり、管理者からの検証を待ちます。タイプごとに異なる変更もありCます。

すべての異なるタイプには異なるプロファイルページがあり、フィールドは異なります。

だから私はポリモーフィックな関連付けを持つことに決めました、そしてこれは私のモデルがどのように見えるかです

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me

  belongs_to :user_type, :polymorphic => true

end

class A
    has_one :user, :as => :user_type
end

class B
    has_one :user, :as => :user_type
end

class C
    has_one :user, :as => :user_type
end

これがシナリオを実行する正しい方法なのか、それともこれを実装するためのより良い方法があるのか​​を知りたいだけです。

4

2 に答える 2

1

Railsの魔法のtypeコラムが必要です。

# user.rb
class User < ActiveRecord::Base
  # create_table 'users' do |t|
  #   t.string :name
  #   t.string :type
  # end
end

# user_a.rb
class UserA < User
end

# user_b.rb
class UserB < User
end

# user_c.rb
class UserC < User
end

UserA.create(name: "bricker")
user_a      = User.where(type: "UserA").first
same_user_a = UserA.all.first

user_a == same_user_a #=> true
user_a.class          #=> UserA
user_a.is_a? User     #=> true

アップデート

class UserLogin < ActiveRecord::Base
  # create_table :user_logins do |t|
  #   t.integer :user_id
  #   t.string  :user_type
  #   t.string  :login
  #   t.string  :encrypted_password
  # end

  # devise ...
  belongs_to :user, polymorphic: true
end

class User < ActiveRecord::Base
  self.abstract_class = true
  has_one :user_login, as: :user
end

class Admin < User
  # create_table :admins do |t|
  #   t.integer :user_login_id
  #   t.string  :admin_name
  # end
end

class Moderator < User
  # create_table :moderators do |t|
  #   t.integer :user_login_id
  #   t.string  :moderator_name
  # end
end
于 2012-10-01T08:30:08.830 に答える
1

私は前に同じことをしたことがあります

非多型の個別のモデルを使用し、ミックスインと共通の機能を共有することを強くお勧めします。

私はあなたが説明したのと同じセットアップを持っていて、プロジェクトが開発されるにつれてそれが本当に肥大化して複雑になったので、後でそれをリファクタリングしなければなりませんでした

于 2012-10-01T08:12:57.913 に答える