Neo4J宝石-保存未声明的关系



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

事件_问题_控制器.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方法,对吧?我也不知道我该如何获得我的提问表上的事件。这可以通过params访问吗?

更新

你是说这个吗

  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

events/show.html.erb

<%= form_for [:event, @event_question] do |f| %>
#form stuff
<% end %>

事件_问题_控制器.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吗?如果是,则意味着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)中的self是控制器。我想你是想把@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,它将为您创建一个新的关系。

相关内容

  • 没有找到相关文章

最新更新