如何在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 不同的工作。
非常感谢帮助。
如果你有 Job
和 Proposal
模型,你可以使用 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
在我的应用程序中,我有一个用户模型和一个作业模型。用户可以 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 不同的工作。
非常感谢帮助。
如果你有 Job
和 Proposal
模型,你可以使用 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