2

这可以追溯到我对Neo4J Gem 的问题 - 保存未声明的关系

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

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_question两者event都存在但@event_question.events将返回 nil

4

1 回答 1

1

post.comments << comment3post在和之间创建额外的关系comment3。它对其他关系没有任何作用。

这对您来说看起来很奇怪的原因是因为post.comments没有从数据库中检索任何内容。调用class它或任何has_many关联,您会看到它是一个Neo4j::ActiveNode::Query::QueryProxy对象,您可以将其视为未执行的查询。在您调用诸如or之类的可枚举方法或诸如firstor之类each的自定义运算符之前,它实际上并不会去接触数据库。在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避免将来出现混淆。

于 2014-11-21T23:18:12.233 回答