2014-11-21 67 views
2

这又回到了我的问题与此Neo4J Gem - Saving undeclared relationshipsNeo4j的宝石协会和创建关系

在本文档中,他们给这个

post.comments = [comment1, comment2] # Removes all existing relationships 
post.comments << comment3    # Creates new relationship 

从我个人理解的例子,第一行会删除所有关系,因为它是手动将所有相关评论设置为comment1,comment2。

但是第2行做了什么? post.comments应该检索与帖子相关的评论。因此它似乎正在与comment3和其他评论建立关系。但是,我们不想在帖子和评论之间建立关系吗?

要么我不理解语法,它在做什么或写什么不清楚发生了什么。在我的例子

来看,我们有

def create 
    @event_question = EventQuestion.new(event_question_params) 
    if @event_question.save 
     event = Event.find(params[:event_id]) 
     @event_question.update(admin: current_user.facebook_id) 
     @event_question.events << event 
     redirect_to @event 
    else 
     redirect_to :back 
    end 
end 

如果event是我的事件节点和@event_question是我event_question节点,为什么@event_question.events << event创建我event_question和事件之间的关系?

现在我在控制器中得到undefined method '<<' for nil:NilClass,这是另一个问题。

我event.rb有

has_many :in, :event_questions, type: 'questions_of' 

和我event_question.rb具有

has_one :out, :events, origin: :event_questions 

@event_questionevent都存在,但@event_question.events将返回nil

+0

这是一个很好的问题,顺便说一句。 – subvertallchris 2014-11-21 23:20:20

回答

1

post.comments << comment3创建post之间的附加关系和comment3。它不会对其他关系做任何事情。

这个看起来很奇怪的原因是因为post.comments没有从数据库中检索任何东西。请拨打class或任何has_many关联,您会看到这是一个Neo4j::ActiveNode::Query::QueryProxy对象,您可以将其视为未执行的查询。它实际上并不会触及数据库,直到您调用像firsteach这样的可枚举方法或像=<<这样的自定义运算符。 <<query_proxy.rb中定义。

QueryProxy对象的延迟评估是为什么你能够链式方法并执行诸如post.comments.liked_by.username之类的操作。它一直等待,直到它清楚地表明您在点击数据库之前需要某些东西。

您得到undefined method '<<' for nil:NilClass的原因是因为has_one关系的工作方式不同。他们不是懒惰地执行,因为没有什么可以过滤,没有什么可以链接,只有一个可能的结果。只要您拨打@event_question.events,它就会触及数据库,因为没有设置任何内容,它将返回nil。该错误意味着它说:nil没有<<方法。使用@event_question.events = event,你会没事的。您可能需要将该关联更改为has_one :out, :event, origin: :event_questions以避免将来出现混淆。