Ruby on rails 两个表在Rails中具有相同的键,而不是具有一个关系

Ruby on rails 两个表在Rails中具有相同的键,而不是具有一个关系,ruby-on-rails,activerecord,primary-key,Ruby On Rails,Activerecord,Primary Key,我正在开发一个Rail网络应用程序。我有两个模型,User,它包含非常基本的信息:id、用户名和密码,以及Profile,其中包括每个用户的Profile。(主要原因是有一个轻量级的用户模型,将定期调用,以及一个完整的配置文件,将不定期调用)。每个模型都有许多子模型 现在,我有一个配置文件,它有自己的主键,然后是一个外键用户id来匹配这个用户 但是,我想知道我是否应该拥有与用户模型具有相同键的概要文件模型(即,如果记录引用相同的用户,则Profile.id==User.id)。这很方便,因为当我

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

现在,我有一个配置文件,它有自己的主键,然后是一个外键用户id来匹配这个用户

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

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

对于这种情况,你有什么建议


谢谢。

我建议您使用如下has\u-one关系映射

用户类 迁移
听起来您应该在
Profile
User
之间使用一对一的关系。您可以使用
has_one
belishing_to
声明来创建它

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end
class用户
正如Rails第四版《敏捷Web开发》中所述:

这里说明了一条重要的规则:包含外键的表的模型始终具有
属于
声明


Rails的惯例是使用模型名作为单数形式,而数据库表是单数形式plural@MBO:你说得对。我倒过来想的。谢谢。嗨,马修,这就是我现在正在做的。然而,这种方法的缺点是:当我有属于Profile的子对象,并且我需要找出与子对象相关联的用户时,我需要首先与Profile合并,然后才能找到用户。这需要一个额外的合并步骤(这是昂贵的b/c这两个表很大)。我无法将子类分配给用户,因为在您上面的问题中还有其他约束(如表单等),Profile和Spec实际上是同一个模型吗?换言之,您是否有四个模型配置文件、用户、规范和子模型,还是只有三个模型配置文件、用户和子模型?是的。我纠正了问题中的例子。此外,配置文件和用户具有一对一的关系。我只把它们分成两种型号,以便轻载。
create_table :users do |t|
   t.string :username
   t.string :password
end
create_table :profiles do |t|
   t. integer :user_id 
    ... other attributes
end
class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
end