2013-10-04 3 views
0

Rails 3.2.14를 사용하여 응용 프로그램을 만들려고하고 있지만 지금까지 작성한 모델 연관 주위에 머리를 감쌀 수 없습니다. 나는 원하는 결과를주기 위해 상호 연결된 네 가지 모델을 가지고 있지만 지금까지는 작동하지 않았다. 필드Ruby on Rails Model association

  • Job : user_id, 필드 title
  • Jobapplication : job_id, user_id, 필드 isrefused
  • Resume : user_id, profession

나는 모든 작업을 추출하려고하는 특정 사용자가 jobapplication 모델을 인스턴스 변수에 사용하여 전망.

외래 키를 포함하는 모든 테이블에는 belong_to 연관이 있고 다른 끝에 has_many이 있습니다.

지금까지 내가 컨트롤러에서이 같은 시도 :

def applied job 
    @jobapplications = Jobapplication.where('user_id = ?', current_user.id) 
    @jobs   = @jobapplications.jobs 
end 

목적은 사용자가 애플리케이션에 넣어 갖고있는 일자리를 찾는 것입니다.

모델 연결을 다시 설계해야합니까?

답변

2

되는 접근은 크게 간소화 할 수 있습니다

class User < ActiveRecord::Base 
    has_many :jobs     # jobs posted 
    has_many :job_applications  # job applications posted 
    has_many :applied_jobs, through => :job_applications, :source => :job # jobs applied for 
    has_one :resume 
end 

class Job < ActiveRecord::Base 
    belongs_to :user 
    has_many :job_applications 
    has_many :applicants, :through => :job_applications, :source => :user # applicants for this job 
    has_many :applicant_resumes, :through => :job_applications, :source => :resume 
end 

class JobApplication < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :job 
    has_one :resume, :through => :user # the resume for the application 
end 

class Resume < ActiveRecord::Base 
    belongs_to :user 
end 

을 이제 당신이 할 수있는 사용자가 신청 한 작업을 쉽게 찾을 수 있습니다.

current_user.applied_jobs 

또는 특정 작업에 대한 모든 신청자 (사용자가 신청) :

@job.applicants 

그리고 당신은 사용자의 이력서 볼 수 있습니다

current_user.resume 

또는 응용 프로그램의 이력서 :

@job_application.resume 

또는 특정 직업에 지원하는 모든 이력서 :

@job.applicant_resumes 
+0

완벽합니다. 나는이 토론을 조금 더 나아갈 것이다. 이력서 테이블을 통합하는 방법. 나는 사용자의 프로파일 정보를 제공하는 별도의 이력서 테이블을 가지고있다. 사용자는 belongs_to 및 사용자 has_one을 재개하십시오. 고용주 (고용 된 사용자)의 관점에서 주어진 jobapplication에서 이력서를 검색하는 방법. – user2716736

+0

필자가 이해하는 한, job_application.user는 작업을 신청하는 사용자입니다. 그렇다면 하나의 이력서 만 JobApplication에 첨부 할 수 있습니다. 그 맞습니까? – PinnyM

+0

@ user2716736 -이 이해를 기반으로 업데이트되었습니다. – PinnyM

1

이 괜찮아 보인다 :

@jobs = @jobapplications.jobs 

jobs 방법은 무엇입니까 : 이것에 대해 확실

@jobapplications = Jobapplication.where("user_id =?", current_user.id) 

하지만?

이 시도 :

#some_controller.rb 

def applied_job #note the underscore! 
    @jobapplications = Jobapplication.where("user_id =?", current_user.id) 
end 

을하고이 같은 모델 연결을 작성하는 경우 뷰에

<% @jobapplications.each do |application| %> 
    #list applications here 
<% end %> 
+1

N + 1 개 검색어에도 불구하고 작동합니다. 이 문제를 해결하기 위해'includes '를 추가 할 수는 있지만, 필요한 ActiveRecord 연관을 간단하게 작성할 수 있으면 불필요하게 지저분 해집니다. – PinnyM

+1

당신의 방법은 훨씬 좋네요 :) +1 – dax

+0

닥스 내가 깔끔한 대답이 아니더라도, 나는 이것을 통해 일하는 방식을 좋아합니다. 내가 너의 대답을 모두 좋아하기 때문에 나는 너에게 두 +1을 모두 줬다. – Nikola