Neo4J宝石 - 拯救未宣布的关系

时间:2014-11-11 08:40:33

标签: ruby-on-rails neo4j neo4j.rb

我正在尝试在这里描述的两个节点之间创建一个实现 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方法吗?我也不知道如何获得我的问题表格所依据的事件。可以通过参数来获取吗?

更新

你的意思是

  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

1 个答案:

答案 0 :(得分:0)

create_rel刚刚测试时效果很好。它是在说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命令,它将发出大量包含参数名称的信息。

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

编辑:第2部分

您收到undefined method,因为self中的@event_question.create_questions_of(self,@event)是控制器。我想你正试图将@event_question发送给自己。不要这样做,只需从self内拨打create_questions_of即可获得当前的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,它会为你创建一个新的关系。