从一个模型到同一模型的多个关联

时间:2013-10-02 21:27:34

标签: ruby-on-rails activerecord

我有两个模型:Job和User。

class Job < ActiveRecord::Base
end

class User < ActiveRecord::Base
end

我希望一份工作同时拥有一个引用用户的“所有者”和一份分配给该工作的用户列表。

基本上,我希望能够做到:

job.owner # return user
job.users # returns users

使用ActiveRecord关联对此进行建模的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

Rails协会的大部分魔力都在为你找出类名。但是,如果需要,您可以自己指定。

以下是架构应该是什么样的:

create_table :jobs do |t|
  t.integer :owner_id
end

create_table :users do |t|
  t.references :job
end

以下是模型应该是什么样子

class Job < AR::Base
  belongs_to :owner, class_name: "User"
  has_many :users
end

class User < AR::Base
  belongs_to :job
end

答案 1 :(得分:1)

class Job < ActiveRecord::Base
  belongs_to :owner, class_name: User
  has_many :users
end

class User < ActiveRecord::Base
  has_many :owned_jobs, class_name: Job
  belongs_to :job
end

这样你就有了:

@user.job
@user.owned_job

@job.owner
@job.users

还要创建这样的列:

class SomeMigration
  def change
    add_column :jobs, :owner_id, :integer
    add_column :users, :job_id, :integer
  end
end

您可以在此处阅读更多内容:http://guides.rubyonrails.org/association_basics.html

答案 2 :(得分:0)

我认为你可能想要另一个模型,因此用户可以在两个不同的环境中找到工作 - 作为工作所有者和工作用户。

我会尝试这样的事情:

# Setup user model (users own jobs)
class User < ActiveRecord::Base
  has_many :jobs
  has_many :user_job_subscriptions
end

# Setup job model
class Job < ActiveRecord::Base
  belongs_to :user
  has_many :user_job_subscriptions
end

# Setup job subscription model (users can also have/subscribe to jobs)
class UserJobSubscriptions < ActiveRecord::Base
  attr_accessible :user, :job
  belongs_to :user
  belongs_to :job
end

此外,这是一个非常棒的视频(它有点过时,但没关系),这将有助于您了解可用的不同类型的关联 - 以及为何/何时使用它们:http://railscasts.com/episodes/47-two-many-to-many