2011-12-21 5 views
0

내 첫 번째 문제는 이것이 전혀 작동하지 않을지 확신 할 수 없다는 것입니다. 그러나 나는 이미 많은 도움을 받았기 때문에 나는 적어도 나 자신에게 물어볼 것입니다.어소시에이션으로 레코드 찾기

내가 가진 것은 모델 'thesis'입니다.이 모델은 관계 모델과 has_many 'checked_tasks'를 통해 has_many 'tasks'를 수행합니다. 이제는 작업 수에 따라 check_tasks 수를 늘리는 이론 만 갖고 싶습니다.

class Thesis < ActiveRecord::Base 
    has_many :tasks, :through => :relations 
    has_many :checkedtasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :relation 
end 

class CheckedTask < ActiveRecord::Base 
    belongs_to :thesis 
end 

내 첫번째 생각은 단순히 Thesis.where (자기 .tasks.count == 자기 .checked_tasks.count)에이었다 -하지만 난 대신 사용하는 알아낼 coudn't 자체을 사용하십시오.

그 후, 나는 오순절 범위를하려고했지만 그 문제는 여전히 나에게 남아있다. 그렇다면, 내가 어떤 도움을 매우 감사 할 것

+1

'CheckedTask'는 완료로 표시된 작업입니까? – jefflunt

답변

1

그러나 이것은 실행 쿼리 꽤 돼지입니다 :

Thesis 오프 확인 작업 목록을 얻으려면. 당신이 논제의 일부에 의해 제안 된 라인을 따라 데이터 모델을 재 설계해야한다는 느낌이 들지만, 논문과 과제 사이의 조인 모델을 사용하여 논문을위한 과제의 체크를 저장해야합니다.

+0

괜찮습니다. 나는 데이터 모델에 여분의 부울 플래그를 추가하는 것보다 이러한 방식을 선택하는 것이 더 나은 해결책이라고 생각했지만, 모두가 나에게도 다른 방식으로 나에게 도움이된다면 말이다. 어쨌든, 도와 주셔서 감사합니다! – m2dax

+0

그래서 당신이 모두 말하고있는 것 같아요 내가 처음부터 그것을하고 싶었던 것처럼 WHERE WHININ WHERE WHERE 절에 접근 할 수 없다는 것입니다. – m2dax

+0

게시 한 쿼리는 사용자가 시도하는 것과 동일해야합니다. –

1

CheckedTask이 간단하게 표시되어있어 작업입니다 -

는 결국, 나는 '레일 방식'할 것을이 있는지 확실하지 않습니다 완전한? 그렇다면 왜 다른 수업이 필요한지 모르겠습니다. 작업은 작업이며 완료되었거나 완료되지 않았습니다. 이 상태를 추적

당신의 Task 모델에 scope와 같은이 작업을 수행 할 수 있어야한다 :

class Task < ActiveRecord::Base 
    scope :checked, lambda { where(:complete => true) } 

    ... 
end 

을하고 tasks 테이블에 boolean 열이 거기 있는지 확인 complete라고 - 그것은해야 작업이 아직 완료되지 않은 경우 false이고 작업이 완료되면 true이됩니다. 당신은

Thesis.joins(:checked_tasks, :tasks).group("thesis.id").select("thesis.*, count(distinct tasks.id) as task_count, count(distinct checked_tasks.id) as checked_count").having("checked_count = task_count") 

을 할 수

@thesis = Thesis.all.fist # <= the first Thesis in the DB 
@thesis.tasks.checked  # <= a collection of Task objects that have been checked 
+0

사실, 그 뒤에는 더 많은 것들이 있습니다. 나는 그 방법을 이해하는 것이 더 쉬울 수도 있다고 생각했습니다. 과제 자체는 여러 유형의 논문에 사용할 수 있습니다. 그러므로 많은 논문에 사용되기 때문에 태스크는 부울 플래그를 가질 수 없습니다 ... – m2dax

+0

그렇다면'Task' 대'CheckedTask'의 목적은 무엇입니까? 응용 프로그램에서 이들이 나타내는 개념은 무엇입니까? – jefflunt

+0

모든 논문에는 논문이 완성되기 전에 완료해야하는 ** 과제 **가 있습니다. 또한, 모든 논문은 논문을위한 작업이 정의 된 ** type **, thorugh를 가지고 있습니다. 이 관계는 ** 관계 ** 테이블에서 설정됩니다. 결국 – m2dax