我正在尝试创建两个节点之间的关系,如下所述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
,它将为您创建一个新的关系。