1

我正在尝试在两个节点之间创建一个关系,如此处所述 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'

事件.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控制器中的方法,对吗?我也真的不知道如何获得我的问题表所在的事件。可以通过参数访问吗?

更新

你是说这个吗

  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

事件.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

路线.rb

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

1 回答 1

0

create_rel我刚才测试它时工作正常。是在说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/,那么您可以在 中获取事件 ID params[:event_id]。从您的项目目录运行rake routes命令,它会吐出大量包含参数名称的信息。

最后,当您使用selfin时@event_question.create_questions_of(self,@event),您将获得控制器。如果您希望它引用@event_question,只需从方法中删除第一个参数create_questions_ofself在其中使用。

编辑:第 2 部分

你得到了undefined method因为selfin@event_question.create_questions_of(self,@event)是控制器。我想你正试图将@event_question 发送给它自己。不要那样做,只要self从内部调用create_questions_of,你就会得到当前的 EventQuestion。

如果你想要回调、验证、属性等,你可以使用has_manyActiveRel ...rel_classtypeorigin

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,它会为你建立一个新的关系。

于 2014-11-11T18:03:22.630 回答