2013-04-08 54 views
0

我有一個多態型的關聯,其中,一個管理員和開發者每個有一個用戶(爲一個共同的認證機構)多態性關聯標識,HAS_ONE和唯一

Developer.rb

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

Admin.rb是相同的,但不添加任何新屬性

User.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始終是唯一的,它與我剛剛創建的開發人員或管理員相同。這似乎也符合與圖here

如果我有profile_type = Developer用戶,我想給開發者一個參考,是安全的獲得通過調用Developer.find(u.profile_id)參考,同樣地,對於管理員?如果不是,那我該如何安全地做到這一點?

它現在有效,但我不確定它是否幸運,因爲我的桌子很小。

+0

是。快速回答是,因爲你將'profile type'設置爲「Developer」,User'profile id'應該匹配'Developer'表中的一個。 – jason328 2013-04-08 18:35:12

+0

我只是困惑,那麼他爲什麼在這個railscast中定義'find_commentable'方法:http://railscasts.com/episodes/154-polymorphic-association。 (該方法可在「註釋」部分查看) – 2013-04-08 18:40:03

回答

1

是的。快速回答是,因爲您將配置文件類型設置爲「開發人員」,用戶配置文件ID應該匹配Developer表中的配置文件。想象一下,一個第二,你有

用戶一

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

用戶兩個

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

因爲你設置的多態關聯,Rails的處理所有的工作適合你。無需擔心身份證衝突。當然,除非你改變用戶兩到

更新的用戶兩個

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

那麼Rails會不知道,當你有兩個用戶爲同一開發商做什麼。

而且你的開發人員和管理員的表中,你應該找到

開發表

id: 1 
skype_name Bob123 

管理員的表

id: 1 
skype_name Shelly78 
+0

因此,配置文件表中的唯一鍵是profile_type和profile_id的組合?用戶ID確實不可能都是一樣的嗎? – 2013-04-08 18:45:04

+0

是的,profile_type告訴Rails在Developer表或Admin表中查找用戶的關聯。你也可以使用profile_type來設置某種if/else語句來爲開發者或管理員等指定動作。你能否澄清你的後一個問題。 – jason328 2013-04-08 18:47:32

+0

在你的例子中,你的第一個列出的屬性是「id:1」,但它們都是1.這是User table的關鍵是不是它?當然,這需要獨特? – 2013-04-08 18:49:49