2014-11-24 160 views
1

這是一個相當簡單的問題。Neo4j gem - 更新關係屬性方法

是否有更新寶石中關係屬性的具體方法?我似乎無法做一個簡單的update_attributesupdate

我的關係被創建並且更新未定義爲無類。

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

我還有另一種方法嗎?

回答

1

每當你得到一個關於nil類未定義的錯誤,它應該是一個直接的信號給你,問題是你調用方法的變量,而不是你調用的方法。換句話說,因爲它說nil沒有update方法,所以你的重點應該放在實際上爲零的變量上。這裏的問題:爲什麼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 

然後你的控制器需要檢查rel是否被實際創建正確。

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財產,這看起來像是向模型添加驗證的好地方,以確保該屬性始終設置爲create。

+0

謝謝克里斯。 Ruby通常返回最後一個對象。如果你只是'InvitationRel.new(from_node:event,to_node:user).save',我想知道爲什麼沒有返回關係對象。爲什麼我們需要明確地歸還它?在我不知道的創作中有沒有巧妙的? – Clam 2014-11-24 20:22:45

+0

'save'不返回被調用的對象,它返回對象是否成功保存的布爾值。 'create'不會返回對象,但不會顯示它是否成功。這就是爲什麼你看到'如果obj.save然後do_this else do_that''模式無處不在。 – subvertallchris 2014-11-24 20:54:59