2013-04-02 284 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