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