2013-08-11 2 views
3

Ruby on Rails 3.2.13을 사용하고 있습니다. 이전 질문에서 "How should I use the alias_method_chain for the build method?"이 발견되었으므로 원하는 모델을 얻기 위해 내 모델 클래스의 build 메서드를 재정의 할 생각입니다.내 모델의`build` 메소드를 어떻게 대체 할 수 있습니까?

어떻게/I합니다 (build 방법으로 같은 @article.comments.build(...)ActiveRecord 연관들에 대해 실행도) 내 모델의 build 메소드를 오버라이드 (override) 할 수 있습니까?

+0

Rails 소스를 깰 시간이 생겼습니다! –

+0

@Alex D - 아니요. – Backo

답변

1

buildActiveRecord::Relation 클래스의 새로운 별칭입니다. 당신이 ActiveRecord::Relation 개체에 build 메소드를 호출하면 문자열 "HHHHHIIIII을"

# config/initializers/monkey_patch.rb 
class ActiveRecord::Relation 
    def build 
    "HHHHHIIIII" 
    end 
end 

:

여기
alias build new 

가 어떻게 build 메소드를 오버라이드 (override)하는 것입니다 별칭을 할 수있는 source code에서이 라인이있다 반환됩니다. 예를 들어, 코스 has_many 학생들의 경우,이 라인은 rails console에서 "HHHHHIIIII"를 반환합니다

# config/initializers/monkey_patch.rb 
class ActiveRecord::Relation 
    def my_model_build 
    "Happy happy, joy joy" 
    end 
end 
+0

응용 프로그램의 모든 모델이 아닌 * one * 모델에 대한 동작을 변경해야합니다. – Backo

+0

@Backo - ActiveRecord :: Relation # build'의 기능을 유지하면서 모델에 사용자 정의 빌드를 추가하려면 사용자 정의 메소드를'ActiveRecord :: Relation' 클래스에 추가하십시오. 내 대답을 업데이트하여이 클래스에 메서드를 추가하는 방법을 보여 줬습니다. 어떤 장소에서는'ActiveRecord :: Relation # build' 메소드를 오버라이드 할 수 있다고 생각하지 않습니다. – Powers

7

이 있습니다 :

여기
Course.first.students.scoped.build 

는 액티브 :: 관계 클래스에 메서드를 추가하는 방법입니다 당신이 빌드의 기본 PARAMS이 필요하지 않은 경우

class Article 
    has_many :comments do 
     def build(*args, &block) 
      #TODO your code 

      super(*args, &block) 
     end 
    end 
end 

을 : 방법은 모델 관계에 build을 정의, 빌드 방법을 사용자 정의 할 수 방법을 사용하면 자신 만의 방법을 사용할 수 있습니다.

관련 문제