Rails has_many:通过和has_one:通过协会

问题描述:

首先我使用Rails 3.13-1稳定分支更新一小时前。Rails has_many:通过和has_one:通过协会

我开发一个应用程序,我有3个重要的车型用户公司工作,这里的模型的相关部分:

class User < ActiveRecord::Base 
    has_many :companies_users, class_name: "CompaniesUsers" 
    has_many :companies, :through => :companies_users, :source => :company 
end 

class Company < ActiveRecord::Base 
    has_many :companies_users, class_name: "CompaniesUsers" 
    has_many :employees, :through => :companies_users, :source => :user 
    has_many :jobs, :dependent => :destroy 
end 

class Job < ActiveRecord::Base 
    belongs_to :company, :counter_cache => true 
end 

class CompaniesUsers < ActiveRecord::Base 
    belongs_to :company 
    belongs_to :user 
end 

代码工作得很好,但我一直在想,如果有可能:

我想一个工作雇主链接,所以认为这种情况的:用户约翰谁是在雇员例,他张贴的工作Rails开发者,所以我想访问@ job.employer,它应该让我回到用户约翰,在其他关键词:

@user = User.find_by_name('john') 
@job = Job.find(1) 
@job.employer == @user  #=> true 

于是我想到了两个可能的解决方案

首先解决

class Job 
    has_one :employer, :through => :employers 
end 

class User 
    has_many :jobs, :through => :employers 
end 

class Employer 
    belongs_to :job 
    belongs_to :user 
end 

第二类解决方案

class Job 
    has_one :employer, :class_name => "User" 
end 

class User 
    belongs_to :job 
end 

我应该去哪条路线?我的代码是否正确?

我有另一个问题,如何摆脱class_name =>“CompaniesUsers”选项传递给has_many,该类应该是单数还是复数?我应该将它重命名为员工

PS:我贴到Ruby on Rails: Talk

+0

你想让一个工作只属于一个雇主(用户)吗? – Dogbert

+0

是的,一个工作应该只属于一个雇主(用户),并且一个用户有很多工作。然而,拥有这份工作的用户必须是公布的工作公司的雇员。 – kalbasit

同样的问题,除非我失去了一些东西,我会建议简单地做

class Job 
    belongs_to :employer, :class_name => "User" 
end 

class User 
    has_many :jobs 
end 

这将使你喜欢的方法

user = User.first 
user.jobs.create(params) 
user.jobs # array 
job = user.jobs.first 
job.employer == user # true 

您需要在工作表中使用employer_id整数字段才能正常工作。

+0

问题是一份工作已经属于一家公司(请参阅我的代码上面),所以我应该使它多态联系对吗?尽管我在Job和Company之间的关联中启用了counter_cache,但我怎样才能通过多态关联来启用它呢? – kalbasit

+0

属于公司的工作不应该是一个问题。这将存储在'company_id'中。 – Dogbert

+0

贵公司有很多用户,用户有很多公司,但工作应该属于_one_ company和_one_用户,对吧? – Dogbert

通常你想通过模型来命名通:

company_user 

那么你不需要这样的:

class_name: "CompaniesUsers" 

只是让你的数据库表中确认的名称是:

company_users 

你对你有用,所以这很好。我只是发现,当我不遵守约定我 跑到麻烦下路。