2013-04-08 94 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