0

管理者と開発者がそれぞれユーザーを持つポリモーフィックな関連付けがあります(共通の認証メカニズム用)

開発者.rb

class Developer < ActiveRecord::Base
  attr_accessible :skype_name
  has_one :user, :as => :profile, :dependent => :destroy
  accepts_nested_attributes_for :user
end

Admin.rbは同じですが、新しい属性は追加されていません

ユーザー.rb

class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation, :profile_id, :profile_type
  has_secure_password

  belongs_to :profile, :polymorphic => true
  before_save { |user| user.email = email.downcase }

  ... some validations for unique email and before_save stuff ...
end

Rails コンソールを使用して開発者または管理者を作成すると、User.profile_id は常に一意であり、作成したばかりの開発者または管理者と同じです。こちらの図にも合いそうです

profile_type=を持つユーザーがいDeveloperて、開発者への参照を取得したい場合、 を呼び出して参照を取得しても安全Developer.find(u.profile_id)ですか? 同様に管理者も同様ですか? そうでない場合、どうすれば安全に行うことができますか?

現時点では機能していますが、テーブルが小さいため、運が良かっただけかどうかはわかりません。

4

1 に答える 1

1

はい。簡単な答えは、プロファイル タイプを「開発者」に設定したため、ユーザー プロファイル ID が開発者テーブルのものと一致する必要があるということです。あなたが持っていることを少し想像してください

ユーザー 1

id: 1
name: Bob
profile_type: Developer
profile_id: 1

ユーザー 2

id: 2
name: Shelly
profile_type: Admin
profile_id: 1

ポリモーフィック アソシエーションはユーザーが設定するため、Rails がすべての作業を処理します。ID の競合について心配する必要はありません。もちろん、ユーザー 2 を

更新されたユーザー 2

id: 2
name: Shelly
profile_type: Developer
profile_id: 1

そうすると、同じ開発者として 2 人のユーザーがいる場合、Rails は何をすべきかわかりません。

そして、開発者と管理者のテーブル内で見つける必要があります

開発者テーブル

id: 1
skype_name Bob123

管理者のテーブル

id: 1
skype_name Shelly78
于 2013-04-08T18:41:40.020 に答える