【问题标题】:Difference between has_one and belongs_to on a 1 to many relationship in Ruby on RailsRuby on Rails中一对多关系上has_one和belongs_to之间的区别
【发布时间】:2013-05-10 22:45:18
【问题描述】:

这个想法是我有一个表用户和一个表客户。每个用户都有许多只与他们相关的客户。实际上我使用这个模型。因此,每个将被创建的客户也会在客户表中获得相关的 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

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

问候 否认

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 relational-database relationship


    【解决方案1】:

    这实际上不会是相同的结果......

    第一个:

    class Customer 
      belongs_to :user
    end
    
    class User
      has_many :customers
    end
    

    将在 Customer 中设置 user_id,而在 User 中不设置任何内容。这意味着一个客户只能与一个用户相关联。在反射方面,您可以执行以下操作:

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

    【讨论】:

    • 其实我正在考虑用这个来提醒自己:) 不知道为什么有人建议你使用第二个虽然 Oo
    • 不知道,但现在让我困惑了 2 天。但是你发帖让我再次相信我的解决方案:)
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多