2011-02-22 3 views
2

내가 레일 응용 프로그램에서 두 개의 클래스가 있다고 가정확장 액티브 레코드는 중복을 줄이기 위해

class Subject < ActiveRecord::Base 
    def children? 
    Subject.where(:parent_id => self.id).length > 0 
    end 

def children 
    Subject.where(:parent_id => self.id) 
end 
end 


class Region < ActiveRecord::Base 
    def children? 
    Region.where(:parent_id => self.id).length > 0 
    end 

def children 
    Region.where(:parent_id => self.id) 
end 
end 

은 무엇 중복 클래스 메소드를 줄일 수있는 가장 좋은 방법이 될 것입니까? 두 가지 새로운 방법으로 ActiveRecord를 확장 할 수 있습니까? 그렇다면 두 클래스 모두에서 사용할 수있는 두 가지 새로운 메소드를 어떻게 작성할 수 있습니까?

덕분에, 마이크

답변

2

실제로 처리하는 대상은 has_many입니다.

DRY 원칙은 매우 좋지만이 경우는 아닙니다. 당신은 주 그림을 복잡하게하는 동안 아주 단순하고 모국어 인 것들을 모델에서 추출하고 싶습니다.

그래서 당신은 방금 루비 스타일

class Subject < ActiveRecord::Base 
    has_many :children, :class_name => "Subject", :foreign_key => :parent_id 

    def children? 
    children.present? 
    end 
end 
1

가 무엇을 참조하거나 동일한 작업을 수행하려고하는 것 같습니다로 사용하는 acts_as_tree에서보세요.

1

짧은 수정 작은 물체를 처리하는 경우 응용 프로그램 도우미 파일이 일반적인 방법을 만드는 것입니다 :

def children?(myObject) 
    myObject.where(:parent_id => myObject.id).length > 0 
end 
def children(myObject) 
    myObject.where(:parent_id => myObject.id) 
end 

편집 : 당신은 액티브있는 방법을 정의 할 수 있습니다 집중적 무엇보다 자원 :: 기지는 둘 다 그것으로부터 상속 받기 때문에.

def children? 
    self.where(:parent_id => self.id).length > 0 
end 
def children 
    self.where(:parent_id => self.id) 
end 
1

본인은 acts_as_tree 사용에 대한 @ abdollar의 제안에 동의합니다. 또는 같은 테이블 (act_as_tree가하는 것)에 연관을 만들 수도 있습니다.

당신이 예로 준 그 방법을 사용하여 자신의 롤 원하는 경우, 당신은 당신이 필요로하고 모델에 포함시킬 수있는 lib 디렉토리에있는 모듈을 만들 수 있습니다 ...

# lib/children.rb 
module Children 
    def children 
    self.class.where(:parent_id => self.id) 
    end 

    def children? 
    children.present? 
    end 
end 

# app/models/subject.rb (or any other model) 
require 'children' 
class Subject < ActiveRecord::Base 
    include Children 
end 

당신이 만약 ' 레일 2를 사용하면 lib가 자동로드되므로 require 'children'을 수행 할 필요가 없습니다. 레일 3을 사용하고 있다면, 이니셜 라이저 나 다른 것을 청소할 수 있습니다.

+0

조금 리팩토링 수'children.size> 0 '=>'children.empty?': – fl00r

+0

그래, 좋네요 .. 좋은 지적. 나는 당신이'! children.empty? ', 또는 훨씬 더 관용적이라고 가정한다. 'children.present? ' – idlefingers

+0

+1'present? ': D – fl00r

관련 문제