2014-04-28 3 views
0

레일 4 앱이 있습니다. 아주 간단한 질문입니다. 나는 방법을 썼지 만 어디로 가야하는지, 어떻게 부르는지는 모른다.중첩 된 리소스 속성을 기반으로 리소스 속성을 변경하는 방법

리소스가 Goals이고 중첩 리소스가 Tasks입니다 (예 : 각 목표에 작업이 있음). 모든 부분이 잘 작동합니다. 내가 원하는 무엇

가 있도록 설정되어있는 goaltaskstatus 사실되면, true로 그 goal 변화의 status. 모든 goal의 작업 status이있는 경우 검사

completed = true 
@goal.tasks.each do |t| 
    if !t.status? 
    completed = false 
    end 
end 
if completed? 
    @goal.status = true 
end 

:

내가 사용하려는 방법의 내용은 사실, 그렇다면 true로 goalstatus 변경 게다가.

제 아이디어는 그 방법을 Goal 모델에 넣는 것입니다. 그러나 그것은 제가 생각할 수있는 한도 내입니다.

  • 어디로 이동합니까? (내가 생각한 모델에 있나요?)
  • 어떻게해야합니까? 사람에

(나는 방법은 거기에 몇 가지 사소한 구문 오류가있을 수 있습니다 알고 있어요,하지만 실제로 그것을 사용하면, 내가 테스트하고 조정할 수 있습니다!)

감사합니다 시간을내어보세요. 다음과 같이

답변

1

당신은 당신의 기능을 단순화 할 수 있습니다 :

@goal.status = @goals.tasks.map(&:complete).all? 

당신이 빨리 여부를 당신의 goal가 완료 가능한 알고 싶은 가정하면, 당신은 당신의 Task 모델에이 기능을 넣을 수 있습니다. 당신이 볼 수 있듯이 하나 goal에 대한 tasks의 많은 경우

def Task < ActiveRecord::Base 
    belongs_to :goal 

    after_save :goal_completed 

    def goal_completed 
    if self.goal.tasks.map(&:completed).all? 
     self.goal.update_attribute(:completed, true) 
    end 
    end 
end 

는,이 매우 빠르게 비용이 많이 드는 얻을 수있는 당신이 goaltasks 모든 모든 당기는하고 있기 때문에, 다음과 같이 당신은 그것을 할 수 있습니다 시간은 task입니다. 따라서 더 큰 데이터베이스의 경우 각 목표에 대해 완료된 작업 수를 유지하는 것이 좋습니다. (이것은 실제로 프로젝트 프로젝트에서 구현 한 것과 매우 비슷합니다.)

goals에 카운터 캐시 열을 추가하고 tasks_count (아직 입력하지 않은 경우)에 추가해야합니다. 또 다른 열 goalscompleted_tasks_count, 또는 이와 비슷한. 둘 다 기본값이 0인지 확인하십시오.

def Goal < ActiveRecord::Base 
    has_many :tasks, inverse_of: :goal, counter_cache: true 
end 

def Task < ActiveRecord::Base 
    belongs_to :goal, inverse_of: :tasks 

    after_initial :set_completed_tasks_count, on: new 
    around_save :goal_complete 

    def set_completed_tasks_count 
    self.completed = false if self.new_record? && self.completed.nil? 
    end 

    def goal_complete 
    yield 
    if self.completed? && !self.completed_was 
     self.review.increment!(:completed_tasks_count) 
    elsif (!self.completed? && self.completed_was) || self.marked_for_destruction? 
     self.review.decrement!(:completed_tasks_count) 
    end 
    end 
end 

잘하면이 도움이됩니다. 해피 코딩!

+0

감사합니다. 그것은 내가 생각했던 것보다 훨씬 포괄적 인 해결책입니다! – aurumpotestasest