2012-05-26 49 views
0

考慮兩種型號:不能確定「模型A屬於模型B」還是「模型B屬於模型A」?

  1. User =>(ID:整數,名稱:字符串,created_at:日期時間,的updated_at:日期時間,部門標識:整數)
  2. Department =>(ID:整數,名稱:字符串,created_at:datetime,updated_at:datetime)

現在,這兩個表之間存在明顯的關係。它是

  • 每個User有一個部門
  • 一個Department屬於多個用戶,即有多個用戶在一個單一的部門

所以,我選擇了E按下下同爲A belongs_to B

class User < ActiveRecord::Base 
    has_one :department 
end 
class Department < ActiveRecord::Base 
    belongs_to :user 
end 

但是,正如您可能知道不起作用&會引發以下錯誤:

> @user = User.find(1) 
> @user.department.name 
    Department Load (1.0ms) SELECT "departments".* FROM "departments" WHERE "departments"."user_id" = 1 LIMIT 1 
ActiveRecord::StatementInvalid: PG::Error: ERROR: column departments.user_id does not exist 

經過多次擊中&審判。我無意中發現了正確的方法來確定這一點,這是圍繞即只是另一種方式B belongs to A

class Department < ActiveRecord::Base 
    has_many :users 
end 
class User < ActiveRecord::Base 
    belongs_to :department 
end 
> @user = User.find(1) 
> @user.department.name 
Department Load (1.0ms) SELECT "departments".* FROM "departments" WHERE "departments"."id" = 1 LIMIT 1 
=> "HR" 

現在,這是我的腦子想着這些關聯的方式正好相反。所以,我有點困惑,所以如果有人能解釋發生了什麼事情?

爲什麼B belongs to A &不A belongs to B

+0

因爲沒有「belongs_to_many」?一個部門有很多用戶 - 我只是想到「belongs_to」作爲該關係的一個反向名稱。 –

回答

1

:has_one關係的第一個例子是在第一次看有點怪。考慮一個用戶和一個賬戶,每個賬戶連接到(屬於)一個用戶,從另一個用戶擁有一個賬戶,只有一個賬戶。帳戶是用戶擁有的。

在這種情況下,您使用的User模型和Rails的has_one關係將搜索在accountsuser_id列(見的Rails指南中的has_one documentation)。

在您的具體情況下,我認爲完美無缺地說「一個部門有很多用戶」和「一個用戶屬於一個部門」。

-1

在你需要列&索引添加到您的表中遷移文件

class AddRelationToDeparments < ActiveRecord::Migration 
    def change 
    add_column, :deparments, :user_id, :integer 
    add_index, :deparments: :user_id 
    end 
end 
+0

如果一個部門有很多用戶,那麼它肯定不需要在其表上使用user_id。另一方面,用戶需要一個department_id,但OP已經有了。 – Ashitaka

2

你弄錯了你的模型。他們應該是這樣的:

class User < ActiveRecord::Base 
    belongs_to :department 
end 

class Department < ActiveRecord::Base 
    has_many :users 
end 

所以,一個部門添加到用戶,你可以這樣做:

@user.department.create(:name => 'Science Department') 

將用戶添加到一個部門,你可以這樣做:

@department.users.create(:name => 'John') 
相關問題