2009-07-15 4 views
1

기본 has_many : 양방향 관계를 통해 :벌크의 기본 코드는 무엇입니까?

has_many 기본 calendar_ids= 함수를 사용하여 이벤트에 일정을 할당하고 싶습니다. 그러나 설정을 통해 재정의하려고합니다. 이 기능은 추가 마법을 추가합니다. 레일 소스를 살펴본 결과이 함수의 코드를 찾을 수 없습니다. 나는 누군가가 나를 가리킬 수 있는지 궁금 하네. 그 다음이 클래스에 대해 재정의하여 원하는 물건을 추가합니다. :)

답변

2

당신은 라인 1295 당신은 확실히 마법 재료를 추가하는 등이 방법을 덮어 피해야한다

def collection_accessor_methods(reflection, association_proxy_class, writer = true) 
     collection_reader_method(reflection, association_proxy_class) 

     if writer 
     define_method("#{reflection.name}=") do |new_value| 
      # Loads proxy class instance (defined in collection_reader_method) if not already loaded 
      association = send(reflection.name) 
      association.replace(new_value) 
      association 
     end 

     define_method("#{reflection.name.to_s.singularize}_ids=") do |new_value| 
      ids = (new_value || []).reject { |nid| nid.blank? } 
      send("#{reflection.name}=", reflection.class_name.constantize.find(ids)) 
     end 
     end 
    end 

에서 파일 lib/active_record/associations.rb의 소스 코드를 찾을 수 있습니다. 레일스는 이미 "너무 마술"입니다. 나는 여러 가지 이유로 모든 사용자 지정 논리와 가상 속성을 작성하는 것이 좋습니다 것입니다 :

  1. 다른 레일 방법은
  2. 는 향후 액티브로 변경하려고 할 수있는 특정 API에 의존 기본 구현에 의존 할 수 버전
+0

아주 좋은 지적입니다. 필자의 예제에서 필자는 이벤트 모델에 캘린더 = 메소드를 덮어 썼다. 아직도 나쁜가요? 이 방법들을 연결할 수 있습니까? 전에는 해 본 적이 없지만 조금 봤습니다. 내가하고 싶은 일은 필요하다면 calendars = parameters에있는 이벤트의 new_value 배열에 추가 이벤트를 추가하는 것입니다. –

0

위의 대답에 대한 응답으로 alias_method_chain을 사용하여 기본 설정 도구를 무시하고 내 기능을 추가했습니다. 비록 정상적으로 사용하는 대신 setter를 보내야하는지 잘 모르겠지만 꽤 잘 작동합니다. 그래도 작동하지 않는 것 같습니다.

def calendars_with_primary_calendar=(new_calendars) 
    new_calendars << calendar unless new_record? 
    send('calendars_without_primary_calendar=', new_calendars) # Not sure why we have to call it this way 
    end 

    alias_method_chain :calendars=, :primary_calendar