Neo4Jgem – 拯救未申报的关系

我正在尝试在两个节点之间创建一个实现,如下所述https://github.com/neo4jrb/neo4j/wiki/Neo4j-v3-Declared-Relationships 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 stuff  

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测试时, create_rel运行正常。 它是否undefined method 'create_rel' for nil:NilClass表示undefined method 'create_rel' for nil:NilClass ? 如果是这样,则表示您的from_node变量实际上没有节点集。 确保您的对象符合您的想法。

这里更好的问题是:你为什么要这样做? 创建未声明的关系时,只要您想使用它,就必须编写自己的Cypher查询。 如果它是您的代码的一部分并且您经常使用它,那么它应该在您的模型中具有has_many关联。 create_rel实际上只是为了提供与没有模型的节点的互操作性。

至于你的另一个问题,你不需要new动作,除非有一个路线和一个与之对应的视图。 如果您在索引页面上加载新问题的表单,那很好。 如果您的URL类似于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删除第一个参数并在方法中使用self

编辑:第2部分

你得到了undefined method因为@event_question.create_questions_of(self,@event)中的@event_question.create_questions_of(self,@event)是控制器。 我想你正试图将@event_question发送给自己。 不要那样做,只需在create_questions_of调用self ,就可以获得当前的EventQuestion。

如果你想要回调,validation,属性等,你可以使用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 ,它会为你创建一个新的关系。