在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能够拥有一家公司,而且该公司可以拥有许多用户(员工)。
当我将用户记录为员工时,我希望能够列出他工作的所有公司。
这样做的最佳方式是什么?
答案 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个表。