1

這個想法是,我有一個表用戶和一個表顧客。每個用戶都有許多隻與他們有關的客戶。其實我使用這種模式。因此,每個將要創建的客戶都將在customers表中獲取相關的user_id。Ruby on Rails中1對多關係上has_one和belongs_to的區別

class Customer 
    belongs_to :user 
end 

class User 
    has_many :customers 
end 

經過一些SO問題後,我向我表明,我應該使用這個模型,爲同樣的結果。

class Customer 
    has_one :user 
end 

class User 
    belongs_to :customer 
end 

但我不明白的差異。任何簡單的解釋我都會用我的方式或錯誤。

問候 denym

回答

1

它實際上不會得到同樣的結果...

第一招:

class Customer 
    belongs_to :user 
end 

class User 
    has_many :customers 
end 

將設置一個USER_ID在客戶和用戶中沒有任何內容。這意味着客戶只能與一個用戶相關聯。在反思的方面,你可以做這樣的東西:

user = User.create(name: 'John Snow') 
customer = user.customers.build(name: 'Tywin Lannister') 
customer.save 

user.inspect 
=> #<User id: 8, name: "John Snow"> 

customer.inspect 
=> #<Customer id: 12, user_id: 8, name: "Tywin Lannister"> 

user.customers.inspect 
=> [#<Customer id: 12, user_id: 8, name: "Tywin Lannister">] 

customer.user 
=> #<User id: 8, name: "John Snow"> 

第二個:

class Customer 
    has_one :user 
end 

class User 
    belongs_to :customer 
end 

都會將用戶CUSTOMER_ID。你可以做這樣的東西:

你的情況
customer = Customer.create(name: 'Tywin Lannister') 
user = customer.build_user(name: 'John Snow') 

user.inspect 
=> #<User id: 8, customer_id: 12, name: "John Snow"> 

customer.inspect 
=> #<Customer id: 12, name: "Tywin Lannister"> 

user.customer 
=> #<Customer id: 12, name: "Tywin Lannister"> 

customer.user 
=> #<User id: 8, customer_id: 12, name: "John Snow"> 

所以

那麼你需要的第一個。

從文檔:

甲belongs_to的關聯建立與另一個模型,使得該模型聲明的每個實例「屬於」其他模型的一個實例的一對一的連接。

has_one關聯也建立與另一個模型的一對一連接,但具有稍微不同的語義(和後果)。該關聯指示模型的每個實例都包含或擁有另一個模型的一個實例。

+0

非常好的工作,謝謝你。 – 2013-05-10 23:39:35

+0

其實我正在考慮用這個作爲提醒自己:)不知道爲什麼你被告知使用第二個雖然Oo – Raindal 2013-05-10 23:40:31

+0

不知道,但讓我困惑了2天。但是你發佈後再次相信我的解決方案:) – 2013-05-11 00:04:52

相關問題