has_many关系在商业洞察力方面似乎不正确或合乎逻辑,需要像belongs_to_many这样的东西吗?

时间:2010-04-24 08:13:36

标签: ruby-on-rails associations has-many has-many-through

我的情况是这样的。 公司拥有众多用户,用户可能属于很多公司。 目前的实施情况如下所示。


  class Company 
    has_many :employments
    has_many :users, :through => :employments
  end

  class Employment 
    belongs_to :company
    belongs_to :user
  end

  class User
    has_many :employments
    has_many :companies, :through => :employments  #This doesn't looks correct
  end

它有效,但“用户有很多公司”看起来没有逻辑意义。它必须是像belongs_to_many公司那样的东西。 我需要使用has_and_belongs_to_many吗?

有人可以建议表达这些关系的正确方法吗?

1 个答案:

答案 0 :(得分:0)

如果您不打算向Employment类添加一些特殊行为,而您实际上并不需要它,那么您应该更好地使用has_and_belongs_to_many。这样它仍然会有一些名为CompanyUser的表,但代码中不会有这样的类。

<强>加了: 2个对象之间只有3个可能的连接:1对1,1对多对和多对多。 Rails指示has_*belongs_to两个对象中的哪一个将获得外键。所以:

  • 1至1:

    使用has_one和belongs_to。 belongs_to的对象获取FK。

  • 1对多的:

    使用has_many和belongs_to。 belongs_to的对象获取FK。

  • 许多一对多:

    has_many [through]或has_and_belongs_to_many用于两个对象。没有人获得FK,而是使用ConnectionTable。

因此没有belongs_to_many这样的东西,因为它与has_many相同 - 提供1对多的相同关系。