2013-04-02 248 views
1

Rails应用程序:建立这种关系的数据库?

  1. 用户has_many职位。
  2. 每个位置都有每下面的架构一家公司(公司名称和公司ID):

    create_table "positions", :force => true do |t| 
        t.integer "user_id" 
        ... 
        t.string "company" 
        t.integer "company_id" 
    end 
    
  3. 我希望用户能够“跟随”尽可能多的个别公司,因为他们想(即用户可以关注许多不同的公司,公司可以跟随许多不同的用户)。看起来这需要用户和职位之间的has_and_belongs_to_many关系,但我希望用户能够遵循位置行的公司属性而不是位置本身。

我应该创建一个新的“跟随”表完全将拉动职位表中的公司匹配到user_id的?或者有没有办法可以设置has_many:通过关系并将user_id映射到company_id的?

谢谢!

+0

“我如何安全地从我的职位表中提取公司专栏并保留职位/公司关系?”。只需创建一个名为company的新表,其中包含'company_id'和'company'列。然后只需从“职位”表中删除公司专栏。 – MickJ

+0

好的,但我需要的是其他所有的位置ID。有没有一个简单的低风险的方式呢? – keypulsations

+0

为position_id添加一列,并为其创建一个dbs序列。写一个小脚本或一个过程,以从序列中填充它。然后一旦它完全填充,添加约束它是唯一的。 – MickJ

回答

0

我大致与MickJ认同,虽然已经建立的公司和用户模型/桌(这显然在每个ID列)我会做它:

create_table "companies" do |t| 
    t.string "name" 
    ... 
end 

create_table "positions" do |t| 
    t.references "user" 
    t.references "company" 
    ... 
end 

create_table "followings" do |t| 
    t.references "user" 
    t.references "company" 
    ... 
end 

型号:

class User 
    has_many :positions 
    has_many :followings 
end 

class Company 
    has_many :positions 
    has_many :followings 
end 

class Position 
    belongs_to :user 
    belongs_to :company 
end 

class Following 
    belongs_to :user 
    belongs_to :company 
end 

你可以做参考公司从位置:

position = Position.first 
puts position.company.name 

或通过类似的用户

user = User.first 
user.positions.each do |position| 
    puts position.company.name 
end 

- EDIT1:

从位置提取的公司名称到一个单独的表你最好关闭写一个小耙子任务 - 是这样的:

Position.all.each do |position| 
    company = Company.find_or_initialize_by_name(position.company_name) 
    position.company_id = company.id 
    position.save 
end 

然后你可能希望编写一个迁移以从职位表中删除公司名称列...只是为了保持整洁。

+0

谢谢你们。我如何安全地从我的职位表中提取公司专栏并保留职位/公司关系? – keypulsations

+0

...我为这个答案的底部添加了一些代码。 –

1

我想你可以有

一个用户表:

integer User_Id 
.... 

一个公司表:

string company 
integer company_id 
... 

一个位置表:

integer user_id foreign_key -> User table 
integer company_id foreign_key -> company table 

一个表(如果用户可以按照有关他是否有它的位置任何北美经销商):

integer user_id foreign_key -> User table 
integer company_id foreign_key -> company table 

如果用户只能跟着一个公司,他有那么您可以添加一个新列来定位表。这将是一个布尔标志,告诉用户是否'跟随'由该职位标识的公司。或者,下表也可以将用户映射到这种情况下的位置。

+0

用户可以关注任何公司(而不仅仅是他/她曾经工作的公司[在他们各自的位置表行中))。如果我当前的数据模型在位置表中确实有公司专栏,那么我如何安全地提取并且保持位置和公司之间的has_one关系的连接? – keypulsations

+0

如果不止一个人可以在同一家公司担任职位,那么我认为您的数据库设计不好。在这种情况下,职位表只能包含公司标识的关键字,而不能包含整个公司的详细信息(像您所拥有的company_id和company_name)。这将有助于您编辑问题位以显示更多当前的架构/数据模型。那么我将能够更好地帮助你。 – MickJ