簡體   English   中英

Neo4J Gem-保存未聲明的關系

[英]Neo4J Gem - Saving undeclared relationships

我試圖在兩個節點之間創建一個from_node.create_rel("FRIENDS", to_node) ,如此處所述:https: from_node.create_rel("FRIENDS", to_node)

我正在為create_rel獲取未定義的方法

我究竟做錯了什么? 我正在嘗試在另一個模型中創建一個Q + A系統。 因此,問題和答案現在都被視為模型。

我為#獲取了一個undefined method create_rel'

event.rb

  has_many :out, :event_questions

event_question.rb

  has_one :in, :events
  has_many :out, :event_answers

  def create_questions_of(from_node,to_node)
    from_node.create_rel("questions_of", to_node)
  end

event_answer.rb

  has_one :in, :event_questions

event_questions_controller.rb

def new
    #is this needed
end

def create
    @event_question = EventQuestion.new(event_question_params)
    if @event_question.save
        @event = Event.find(params[:id])
        @event_question.update(admin: current_user.facebook_id)
        @event_question.create_questions_of(self,@event)
        redirect_to @event
    else
        redirect_to @event
    end
end

private

    def event_question_params
        params.require(:event_question).permit(:question)
    end

我想在事件的索引頁面中放置新問題,因為我想在此之后列出事件中的所有問題。 我什至不需要控制器中的new方法,對嗎? 我也真的不知道如何獲得我的問題表格。 通過參數可以訪問嗎?

UPDATE

你是這個意思嗎

  def create_questions_of(to_node)
    self.create_rel("questions_of", to_node)
  end

 @event_question.create_questions_of(@event)

所以我想我也需要更改路線並將問題嵌套在其中以創建events/123/questions/

然后我可以獲取events_id並使用find

更新#2

events_controller.rb

def show
    @event = Event.find(params[:id])
    @event_question = EventQuestion.new
end

event.rb

  has_many :out, :event_questions, type: 'questions_of'

event_question.rb

  has_one :in, :events, origin: :event_questions

事件/ show.html.erb

<%= form_for [:event, @event_question] do |f| %>

#form stuff

<% end %>

event_questions_controller.rb

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

的routes.rb

resources :events do
    resources :event_questions, only: [:create, :destroy]
  end

當我剛剛測試時, create_rel工作。 它是否undefined method 'create_rel' for nil:NilClass說了undefined method 'create_rel' for nil:NilClass 如果是這樣,則意味着您的from_node變量實際上沒有設置節點。 確保您的對象是您認為的樣子。

更好的問題是:為什么要這樣做? 創建未聲明的關系時,無論何時要使用它,都必須編寫自己的Cypher查詢。 如果它是代碼的一部分並且您定期使用它,則它在模型中可能應該具有has_many關聯。 create_rel實際上僅是為了提供與沒有模型的節點的互操作性而存在。

至於其他問題,除非有路線和與之相對應的視圖,否則您無需執行new操作。 如果您要在索引頁面上加載新問題的表單,那很好。 如果您的網址類似於http://127.0.0.1:3000/events/123/questions/ ,則可以在params[:event_id]獲取事件ID。 從項目目錄中運行rake routes命令,它將吐出很多信息,包括參數名稱。

最后,當在@event_question.create_questions_of(self,@event)使用self時,您將獲得控制器。 如果希望它引用@event_question ,只需從create_questions_of刪除第一個參數, create_questions_of在方法中使用self

編輯:第2部分

你得到的undefined method ,因為self@event_question.create_questions_of(self,@event)是控制器。 我認為您正在嘗試將@event_question發送給自己。 不這樣做,只需在create_questions_of調用self ,您將獲得當前的EventQuestion。

您可以使用ActiveRel如果你想回調,驗證,性能等,...如果你只是想要一個簡單的關系,只安裝了has_many每個模型協會,省略rel_class和任何一方都設置為相同type或一組origin於一。

class Event
  include Neo4j::ActiveNode
  has_many :in, :event_questions, type: 'questions_of'
end

class EventQuestion
  include Neo4j::ActiveNode
  has_many :out, :events, origin: :event_questions
end

origin說:“在對等模型中尋找這種關聯,並使用它定義的類型。” 它使您不必擔心在關聯之間進行類型同步。

之后,您可以執行@event_question.events << @event ,它將為您創建新的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM