Rails has_many:through和has_one:通过关联

时间:2011-06-22 08:50:37

标签: ruby-on-rails ruby-on-rails-3 activerecord has-many-through has-one

首先我在一小时前更新了 3-1-stable 分支中的 Rails 3.1

我正在开发一个应用程序,其中我有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

代码工作正常,但我一直想知道是否可以:

我想将工作雇主相关联,因此请考虑以下情况:用户 John 谁是的员工示例,他发布了Rails开发人员的工作,所以我想访问 @ job.employer ,它应该让我回到用户 John ,换句话说:

@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 =&gt; “CompaniesUsers”选项传递给has_many,该类应该是Singular还是Plural?我应该将其重命名为员工吗?

P.S:我将同样的问题发布到Ruby on Rails: Talk

2 个答案:

答案 0 :(得分:1)

除非我遗漏了某些东西,否则我建议只做

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

您需要在Jobs表中使用employer_id整数字段才能生效。

答案 1 :(得分:0)

通常,您希望为模型传递命名:

company_user

然后你不需要这个:

class_name: "CompaniesUsers"

只需确保数据库表的名称为:

company_users

你有什么为你工作,所以这很好。我发现当我不遵守惯例时 跑进去困扰着这条路。