2014-11-24 2 views
1

이것은 매우 간단한 질문입니다.Neo4j 보석 - 관계 속성 업데이트 방법

보석의 관계에 대한 등록 정보를 업데이트하는 특정 방법이 있습니까? 간단한 update_attributes 또는 update을 수행 할 수 없습니다.

내 관계가 생성되고 nil 클래스에 대한 업데이트가 정의되지 않았습니다.

event = Event.find(params[:event]) 
invite = Invite.create_invitation(event, current_user, nil) #creates relationship 
invite.update(interested: params[:interest]) 

내가 사용해야하는 다른 방법이 있습니까?

답변

1

nil 클래스에 대해 undefined에 대한 오류가 발생할 때마다 문제가 호출하는 메소드가 아니라 메소드를 호출하는 변수라는 사실을 즉시 알 수 있습니다. 즉, nil에는 update 메소드가 없으므로 포커스는 실제로는 nil 인 변수에 있어야합니다. 여기에 질문 : invite이 관계 대신 nil을 반환하는 이유는 무엇입니까?

관계를 만드는 데 사용자 지정 클래스 메서드를 사용하고 있으므로 올바른 개체를 반환하지 않는다고 추측합니다. 다음과 같이 표시되어야합니다.

def self.create_invitation(event, user, something_else = nil) 
    rel = InvitationRel.new(from_node: event, to_node: user) 
    if rel.save 
    rel 
    else 
    # return an error, maybe rel.errors.full_messages? 
    end 
end 

그런 다음 컨트롤러가 실제로 연결이 올바르게 생성되었는지 확인해야합니다.

event = Event.find(params[:event]) 
invite = Invite.create_invitation(event, current_user, nil) #creates relationship 
if invite.neo_id.nil? 
    # the rel did not create correctly, neo_id is only present on persisted objects 
else 
    invite.update(interested: params[:interest]) 
end 

이 문제를 해결하는 데 많은 도움이되는 것처럼 느껴집니다. 당신은 관계의 생성을 분리하고 interested 속성을 설정 할 필요가 없습니다, 당신은 DB에 하나의 호출에 그것을 할 만 할 수

event = Event.find(params[:event]) 
invite = InviteRel.new(from_node: event, to_node: current_user, interested: params[:interest]) 
if invite.save? 
    # rel was created, move on 
else 
    # something wrong in the rel, figure out what it was 
end 

당신은 당신이 항상 interested 속성을 만들거야 알고 있기 때문에 이 속성은 모델에 유효성 검사를 추가하여 속성이 항상 만들어 지도록 설정하는 것이 좋습니다.

+0

감사합니다. chris. 일반적으로 Ruby는 마지막 객체를 반환합니다. 'InvitationRel.new (from_node : event, to_node : user) .save'가 있으면 관계 객체가 반환되지 않는 이유가 궁금합니다. 왜 명시 적으로 반환해야합니까? 창조물에 내가 알지 못하는 미묘한 부분이 있습니까? – Clam

+0

'save'는 호출 된 객체를 반환하지 않으며, 객체가 성공적으로 저장되었는지 아닌지에 대한 부울을 반환합니다. 'create'는 객체를 리턴하지만 성공했는지 여부를 알려주지 않습니다. 그래서 당신은'obj.save then do_this else do_that end' 패턴을 볼 수 있습니다. – subvertallchris