2014-11-21 64 views
2

這又回到了我的問題與此Neo4J Gem - Saving undeclared relationshipsNeo4j的寶石協會和創建關係

在本文檔中,他們給這個

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和事件之間的關係?

現在我在控制器中得到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

+0

這是一個很好的問題,順便說一句。 – subvertallchris 2014-11-21 23:20:20

回答

1

post.comments << comment3創建post之間的附加關係和comment3。它不會對其他關係做任何事情。

這個看起來很奇怪的原因是因爲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以避免將來出現混淆。