Rails has_many:通过和has_one:通过协会
问题描述:
首先我使用Rails 3.1从3-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
答
同样的问题,除非我失去了一些东西,我会建议简单地做
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
整数字段才能正常工作。
答
通常你想通过模型来命名通:
company_user
那么你不需要这样的:
class_name: "CompaniesUsers"
只是让你的数据库表中确认的名称是:
company_users
你对你有用,所以这很好。我只是发现,当我不遵守约定我 跑到麻烦下路。
你想让一个工作只属于一个雇主(用户)吗? – Dogbert
是的,一个工作应该只属于一个雇主(用户),并且一个用户有很多工作。然而,拥有这份工作的用户必须是公布的工作公司的雇员。 – kalbasit