如何关联这些模型(用户,公司),用户可以是雇主还是雇员?

时间:2016-03-31 12:19:01

标签: ruby-on-rails-4 relationship

在Ruby on Rails 4中,我是这些模型:

def User < ActiveRecord::Base
  has_one :company, dependent: :destroy
end

def Company < ActiveRecord::Base
  belongs_to :user
end

现在,我希望User as Employer能够拥有一家公司,而且该公司可以拥有许多用户(员工)。

当我将用户记录为员工时,我希望能够列出他工作的所有公司。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

我不确定如果没有更多信息,我可以给你一个完整的工作代码文件,但我认为这是最好的方法。

class User < ActiveRecord::Base
  self.table_name = "users"
  #Define shared associations/methods
end

class Employee < User
  has_and_belongs_to_many :companies
  #Employee only associations/methods
end

class Employer < User
  has_one :company
  #Employer only associations/methods
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many :employees
  belongs_to :employer
end

由于两者都继承自相同的用户模型,因此它们将共享一个表。由于两个派生模型仅使用has_x,因此外键将位于另一个表中,这意味着它们可以共享一个没有大量空值的表模式。

我再也不确定这会自行解决,但我认为这是一个好的开始。另一个优点是,通过隔离这样的代码,您可以根据人的类型独立更改功能(例如,您可以在用户上使用通用日志功能,但在员工和雇主上更具体 - 例如包括公司或公司他们被绑在一起。)

我意识到还有另一种方法可以做到这一点。您可以使用户与Employee或Employer建立多态关联。然后,您将检查用户记录的类型,然后拉出关联并调用该记录上的方法(员工或雇主)。

我唯一不喜欢这个解决方案的是它涉及3个表格,从我看到的你可以得到1个表。