0

많은 TimesheetRows가있는 Timesheet라는 모델이 있습니다. TimesheetRow는 작업에 속합니다. 레일 : 특정 조건과 일치하는 것이 있으면 개체를 저장하기 전에/확인하십시오.

class Timesheet < ActiveRecord::Base 
    has_many :timesheet_rows, inverse_of: timesheet 
end 
class TimesheetRow < ActiveRecord::Base 
    belongs_to :timesheet, inverse_of: timesheet_rows 
    belongs_to :job 
end 

로그에서 작업 표 객체를 구축하는 동안

, 나는 다음과 같은 작업에 해당하는 timesheet_row 이미 구축되었는지의 여부를 확인하려합니다.

timesheet = Timesheet.new() 

if timesheet.timesheet_rows.exists?(job_id:n) 
    #Do something 
else 
    timesheet.timesheet_rows.build(job_id:n) 
end 
내가 .exists을 시도

(조건) .find? (: 모든 조건), .find_by_job_id (N) 등 데이터베이스의 모든 쿼리, 이야기 해봐 (조건), 따라서되지 않습니다 여기서 유용합니다.

나는 몇 시간 동안 마법의 방법을 찾아 보았지만 아무 것도 찾을 수 없었다. 정말로, 모든 협회를 통해 반복해야합니까?

a 유사 question.

감사

+0

왜 'TimesheetRow' 모델에서'job_id'에 대해'유일성 유효성 검사 '를 설정하지 않으시겠습니까? 그것은 당신의 경우에 작동합니다. – Pavan

+0

그 유효성 검사는 작업 표를 올바르게 저장하는 동안 발생합니다. 방금 저장하지 않는 작업 표를 작성하려고합니다. – Bot

답변

1

시도 루비의 select 방법을 사용하여 다음 결과 배열이 비어있는 경우 검사합니다. @Bot이 코멘트에 제안으로

if timesheet.timesheet_rows.select { |tr| tr.job_id == n }.empty? 
    timesheet.timesheet_rows.build(job_id: n) 
else 
    # Do something 
end 

, 당신은 또한 any?보다는 selectempty? 사용할 수 있습니다.

if timesheet.timesheet_rows.any? { |tr| tr.job_id == n } 
    # Do something 
else 
    timesheet.timesheet_rows.build(job_id: n) 
end 
+0

감사합니다. 이제 저는 세 가지 옵션을 봅니다.? {}, .detect {}. empty ?, .select {}. empty? . 나는 .any? {}를 좋아한다. 답변에 추가 할 수 있습니까? – Bot

+0

문제 없으니 기꺼이 도와 드리겠습니다. '무엇이라도? '라는 위대한 전화, 나는 그것을 나의 대답에 덧붙였다. –

관련 문제