如何在Rails 4 的关联中为同一模型获取不同类型的集合?

How to obtain different type of collections for the same Model in an Association in Rails 4?

在我的应用程序中,我有一个用户模型和一个作业模型。用户可以 post 许多职位,其他用户可以通过 post 申请来申请这些职位。工作 poster 然后可以从已申请的用户列表中 select 一个用户,稍后将分配此用户从事此工作。

这意味着 Job 模型应该为 User 提供两种外键,可能类似于 poster_id 和 worker_id。

目前我的模型是这样的:

class Job < ActiveRecord::Base
   belongs_to :user
   has_many :proposals, dependent: :destroy
end

class User < ActiveRecord::Base
   has_many :jobs, dependent: :destroy
   has_many :proposals, through: :jobs
end

class Proposal < ActiveRecord::Base
    belongs_to :job
    belongs_to :user
end

我的问题是,为了按照我描述的方式工作,这些模型之间的正确关联是什么?

例如,我需要访问某个用户的 posted 职位,以及该用户订阅的职位 (worker_id)。这些是不同的系列,但属于同一型号 Job...

类似于:

@user.posted_jobs.all
@user.current_jobs.all

对于同一个@用户,这些 return 不同的工作。

非常感谢帮助。

如果你有 JobProposal 模型,你可以使用 group_by..这样的例子..所以你可以做类似..

@results = @results.group_by(&:class)
@jobs = @results[Job]
@proposals = @results[Proposal] 

所以

@user.jobs.all #list of all jobs posted by the user

如果你想要用户订阅的工作列表你必须做更多的工作

#subscribeds = [] if u want only the list of jobs subscribeds but not posted
subscribeds = @user.jobs.all # if u want the list of all jobs related to user
@user.proposals.each do |proposal| 
     @subscribeds << proposal.job
end

编辑

要直接处理模型,您可以这样做:

class User < ActiveRecord::Base
   has_many :proposals
   has_many :subscribeds_jobs, class_name: 'Job', through: :proposals
   has_many :jobs
   def all_jobs
      return self.jobs.all + self.subscribeds.jobs.all
   end
end

这样 Rails 将通过记录关联恢复提案作业。

假设您的工作只能有一个在接受提案时设置的工人,您会想要这样的东西:

class Job < ActiveRecord::Base
   belongs_to :poster, class_name: 'User', foreign_key: 'poster_id'
   belongs_to :worker, class_name: 'User', foreign_key: 'worker_id'
   has_many :proposals, dependent: :destroy
end

class User < ActiveRecord::Base
   has_many :posted_jobs, class_name: 'Job', foreign_key: 'poster_id', dependent: :destroy
   has_many :current_jobs, class_name: 'Job', foreign_key: 'worker_id'
   has_many :proposals, through: :jobs
end

class Proposal < ActiveRecord::Base
    belongs_to :job
    belongs_to :user
end

通过这种方法,您可以获得 user.posted_jobs 和 user.current_jobs。

看到这个:Same Model for Two belongs_to Associations