Neo4J宝石协会和创建关系

时间:2014-11-21 20:48:11

标签: ruby-on-rails neo4j associations neo4j.rb

这可以追溯到我对Neo4J Gem - Saving undeclared relationships

的问题

在文档中,他们举了一个这个例子

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和event之间创建关系?

现在我在我的控制器中得到一个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

1 个答案:

答案 0 :(得分:1)

post.comments << comment3postcomment3之间创建了一个额外的关系。它对其他关系没有任何作用。

这看起来很奇怪的原因是因为post.comments没有从数据库中检索任何内容。在其上或任何class关联上调用has_many,您就会发现它是Neo4j::ActiveNode::Query::QueryProxy对象,您可以将其视为未执行的查询。在您调用firsteach之类的可枚举方法或=<<之类的自定义运算符之前,它实际上并不会触发数据库。 <<中定义了post.comments.liked_by.username

QueryProxy对象的延迟评估是您使用链式方法并执行undefined method '<<' for nil:NilClass之类的操作的原因。等到明确表示你需要一些来自数据库的东西才能点击它之前。

您获得has_one的原因是因为@event_question.events关系的工作方式不同。它们不会被懒惰地执行,因为没有什么可以过滤的,没有什么可以链接的,只有一个可能的结果。一旦你调用nil,它就会命中数据库,因为没有设置,它会返回nil。该错误表示它的含义:<<没有@event_question.events = event方法。使用has_one :out, :event, origin: :event_questions,您就可以了。您可能希望将该关联更改为{{1}}以避免将来出现混淆。