기본 has_many : 양방향 관계를 통해 :벌크의 기본 코드는 무엇입니까?
has_many 기본 calendar_ids=
함수를 사용하여 이벤트에 일정을 할당하고 싶습니다. 그러나 설정을 통해 재정의하려고합니다. 이 기능은 추가 마법을 추가합니다. 레일 소스를 살펴본 결과이 함수의 코드를 찾을 수 없습니다. 나는 누군가가 나를 가리킬 수 있는지 궁금 하네. 그 다음이 클래스에 대해 재정의하여 원하는 물건을 추가합니다. :)
기본 has_many : 양방향 관계를 통해 :벌크의 기본 코드는 무엇입니까?
has_many 기본 calendar_ids=
함수를 사용하여 이벤트에 일정을 할당하고 싶습니다. 그러나 설정을 통해 재정의하려고합니다. 이 기능은 추가 마법을 추가합니다. 레일 소스를 살펴본 결과이 함수의 코드를 찾을 수 없습니다. 나는 누군가가 나를 가리킬 수 있는지 궁금 하네. 그 다음이 클래스에 대해 재정의하여 원하는 물건을 추가합니다. :)
당신은 라인 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
의 소스 코드를 찾을 수 있습니다. 레일스는 이미 "너무 마술"입니다. 나는 여러 가지 이유로 모든 사용자 지정 논리와 가상 속성을 작성하는 것이 좋습니다 것입니다 :
를 추가하려면이 클래스의 재정의합니다 :
http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/collection_accessor_methods
그것은 내가 생각했던 것처럼 보이지 않았다 그것은 그렇게 보일 것입니다. 그래서 그것이 내가 그것을 놓친 이유입니다. 나는 calendar_ids = 메소드 대신에 calendars = 메소드를 오버라이드하는 것으로 끝났다. 모든 것이 잘 동작한다.
위의 대답에 대한 응답으로 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
아주 좋은 지적입니다. 필자의 예제에서 필자는 이벤트 모델에 캘린더 = 메소드를 덮어 썼다. 아직도 나쁜가요? 이 방법들을 연결할 수 있습니까? 전에는 해 본 적이 없지만 조금 봤습니다. 내가하고 싶은 일은 필요하다면 calendars = parameters에있는 이벤트의 new_value 배열에 추가 이벤트를 추가하는 것입니다. –