Neo4J 宝石关联和建立关系



这又回到了我对这个 Neo4J Gem 的问题 - 保存未声明的关系

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

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

据我了解,第一行将删除所有关系,因为它手动将所有关联的注释设置为注释 1、注释 2。

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

要么我不理解语法和它在做什么,要么写的东西不清楚发生了什么。

看看我的例子,我们有

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,这完全是另一个问题。

我的事件.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

post.comments << comment3

postcomment3之间创建了额外的关系。它对其他关系没有任何作用。

这对您来说看起来很奇怪的原因是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以避免将来出现混淆。

相关内容

  • 没有找到相关文章

最新更新