2014-11-24 159 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