这又回到了我对这个 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_question
和 event
都存在,但@event_question.events
将返回 nil
post.comments << comment3
在post
和comment3
之间创建了额外的关系。它对其他关系没有任何作用。
这对您来说看起来很奇怪的原因是post.comments
不会从数据库中检索任何内容。调用class
或任何has_many
关联,您将看到它是一个Neo4j::ActiveNode::Query::QueryProxy
对象,您可以将其视为未执行的查询。它实际上不会出去接触数据库,直到您调用可枚举的方法(如 first
或 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
以避免将来出现混淆。