1

这个想法是我有一个表用户和一个表客户。每个用户都有许多只与他们相关的客户。实际上我使用这个模型。因此,将创建的每个客户也将在客户表中获得相关的 user_id。

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

但我不明白。任何简单的解释,无论我的方式是对还是错。

关于否认

4

1 回答 1

2

结果不会是一样的...

第一个:

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 关联还建立了与另一个模型的一对一连接,但语义(和结果)有所不同。这种关联表明模型的每个实例都包含或拥有另一个模型的一个实例。

于 2013-05-10T23:29:40.930 回答