2009-08-07 5 views
27

여러 모델이있는 레일 앱이 있습니다.Ruby on Rails에서 모델 "유틸리티"기능을 넣을 곳

여러 모델에서 액세스하려는 기능이 있습니다.

이 코드를 삽입하는 가장 좋은 장소는 무엇이며 어떻게 접근 할 필요가있는 모델에서이 코드를 액세스 할 수 있습니까?

저의 이해는 도우미가보기 만하는 것입니다. 이 올바른지?

플러그인을 만들어 공급 업체 폴더에 넣는 것이 잘못되었습니다. 이것은 내 코드이며 내 앱에 필수적입니다. 이 올바른지?

감사합니다.

답변

30

가장 간단한 해결책은 lib 디렉토리/fooable.rb에, lib 디렉토리 아래에 모듈을 생성하고, 예를 들어, 그것을 필요로하는 모델로이 혼합하는 것입니다 : 당신의 다양한 모델에

module Fooable 
    def do_foo 
    end 
end 

: 그리고

class MyModel < ActiveRecord::Base 
    include Fooable 
end 

레일스 자동로드 메커니즘은 fooable.rb가 필요하지 않으므로 올바른 규칙을 사용하여 이름을 지정하면됩니다.

+0

레일 4 : 나를 위해 작동하지 않았지만 필요하지 않았습니다. 나는 또한 다음과 같은 함수를 호출해야했다 : Fooable.function – reectrix

+1

@smilingcow'rails 3' 이후로 configuraton의 문제이다. 자세한 내용은 [this] (http://stackoverflow.com/a/5273470/535406) ​​답변을 참조하십시오. – jibiel

+3

이것들은/model/concerns (모델을 확장하는 경우에만 해당)이지만 유틸리티 클래스의 경우 lib/utils (lib는 복잡해 질 수 있습니다)에 넣습니다. – Aeramor

2

코드 반복을 줄이기 위해 해당 모듈을 포함하는 기본 클래스를 만들고 동작을 공유하려는 모든 모델의 기본 클래스를 상속 할 수 있습니다. 같은

뭔가 :

module Fooable 
    def do_foo 
    end 
end 

class ParentModel < ActiveRecord::Base 
    include Fooable 
end 

class Product < ParentModel end 
class User < ParentModel end 
class Item < ActiveRecord::Base end 

따라서,이 예에서, 두 제품 및 사용자는 do_foo 기능을 공유 할 것이며, 항목하지 않을 것입니다.

+11

이것은 물론 작동하지만 반복을 제거하는 것이 상속 체인을 지저분하게 할 가치가 있는지 질문 할 것입니다. 당신은 이것이 정확히 모듈이 불필요한 상속을 피하는 데 도움이되는 것이라고 주장 할 수 있습니다. DRY를 한 단계 진압하는 데 필요한 여러 구문을 사용하지 않으려 고합니다. 나는 그것이 있을지도 모른다라고 생각한다. –

+1

ParentModel에 데이터베이스에 "type"이라는 문자열 열이 있으면이 문제로 인해 [단일 테이블 상속]이 발생합니다 (http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class). -ActiveRecord :: Base-label-Single + table + 상속)을 시작합니다. –

관련 문제