我正在尝试在这里描述的两个节点之间创建一个实现
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
答案 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
,它会为你创建一个新的关系。