两个表在Rails中具有相同的键而不是has_one关系

时间:2011-10-30 22:11:24

标签: ruby-on-rails activerecord primary-key

我正在开发一个Rail webapp。我有两个模型,User,其中包含非常基本的信息:id,用户名和密码,以及Profile,其中包括每个用户的配置文件。 (主要原因是有一个轻量级的用户模型,它将被定期调用,并且一个完整的配置文件将被不规则地调用)。每个模型都有很多孩子。

现在,我使用自己的主键配置Profile,然后使用外键user_id与User匹配。

但是,我想知道我是否应该使用与用户模型相同的密钥的Profile模型(即,如果记录引用同一用户,则为Profile.id == User.id)。这很方便,因为当我有一个属于User的对象时,我希望它属于Profile,反之亦然。例如,我可以为ChildModel指定User has_many和Spec has_many关系。因为它们使用相同的密钥,所以我不必将ChildModel合并到Spec,然后将Profile用户合并到用户以查找与子对象关联的用户。

缺点是未来,如果由于某种原因我在用户和规范的主键之间存在差异,那么我就陷入了深深的麻烦。

您对这种情况的建议是什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

我建议您使用has_one关系映射,如下面的

用户类

class User
  has_one :profile, :dependent => :destroy # you probably want this on destroy
end

迁移

create_table :users do |t|
   t.string :username
   t.string :password
end
create_table :profiles do |t|
   t. integer :user_id 
    ... other attributes
end

答案 1 :(得分:0)

听起来你应该在ProfileUser之间使用一对一的关系。您可以使用has_onebelongs_to声明创建此内容。

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end

使用Rails的敏捷Web开发第四版:

中所述
  

这里有一个重要的规则:包含外键总是的表的模型具有belongs_to声明。