我遇到了这个问题。我有四个模型,工作,用户,简历,应用程序
协会如下
每个用户都有许多工作和许多应用程序
每个作业都属于一个用户
每个简历属于用户
每个作业都有很多应用程序
我需要限制工作海报,以便只能查看他自己的简历(因为他也可以是申请人)和申请他的任何工作的申请人的简历。
我可以通过
限制用户查看自己的简历if current_user.id == @resume.id
但无法找到一种方法来查找已应用于当前用户发布的所有作业的所有用户的简历ID(因为两者都是可枚举的)
我只需要查找登录用户想要查看的简历ID是他自己的,还是在他发布的所有工作的应用程序中(存在?)
需要帮助......
答案 0 :(得分:2)
首先,我认为你有一个错字,在这里:
if current_user.id == @resume.id
这不起作用,因为current_user是一个用户而@resume是一个Resume,所以他们的id不匹配。
您需要添加User#has_one :resume
并使用:
if current_user.resume.id == @resume.id
然后,您需要使用has_many through relation
class Job
belongs_to :user
has_many :applications
has_many :resumes, through: :applications
end
这允许你这样做:
job.resumes
检索当前作业的所有简历,过滤该作业的应用程序。
现在,要获得与作业相关的所有简历的当前用户简历ID和ID,您将采用这种方式:
[ current_user.resume.id ] + current_user.jobs.includes( :resumes ).references( :resumes ).map { |job| job.resumes.map( &:id ) }.flatten
current_user.jobs.includes( :resumes ).references( :resumes )
加载用户的作业,并在查询中预加载简历。
.map { |job| job.resumes.map( &:id ) }
检索简历ID。
.flatten
将数组减少到一个维度,因为每个作业都有一个id数组,否则。
最后,我们将此数组与包含当前用户的resume id的数组连接起来。
现在您拥有了所有这些,您只需要检查该数组中是否包含当前的简历ID:
relative_resumes = [ current_user.resume.id ] + current_user.jobs.includes( :resumes ).references( :resumes ).map { |job| job.resumes.map( &:id ) }.flatten
if relative_resumes.include? @resume.id
# profit !
end