这可以追溯到我对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_question
和event
都存在但@event_question.events
将返回nil
答案 0 :(得分:1)
post.comments << comment3
在post
和comment3
之间创建了一个额外的关系。它对其他关系没有任何作用。
这看起来很奇怪的原因是因为post.comments
没有从数据库中检索任何内容。在其上或任何class
关联上调用has_many
,您就会发现它是Neo4j::ActiveNode::Query::QueryProxy
对象,您可以将其视为未执行的查询。在您调用first
或each
之类的可枚举方法或=
或<<
之类的自定义运算符之前,它实际上并不会触发数据库。 <<
中定义了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}}以避免将来出现混淆。