我正在研究neo4j rails项目,该项目涉及同一模型中节点之间的父子类型关系。任何孩子都可以有多个父母。我希望能够在创建新子项时创建父子关系。我该如何实现呢?目前,应用程序设置为仅在创建子项时创建一个父子关系。
# View for ...things/new
<div class="new-thing-form">
<%= form_for(@thing) do |f| %>
<%= f.text_field :name, placeholder: "Thing Name" %>
<%= text_field_tag :parent, '', placeholder: "Parent Name" %>
<%= f.submit "Create Thing" %>
<% end %>
</div>
# Model for Thing
class Thing
include Neo4j::ActiveNode
property :name, type: String
property :description, type: String
has_many :out, :children_things, type: :PARENT_OF, model_class: :Thing
has_many :in, :parent_things, model_class: :Thing, origin: :children_things
validates_presence_of :name
end
到目前为止,我已经考虑了三种可能的解决方案,并且无法绕过它们(我是网络开发的新手,所以如果这是基本的东西,我会道歉)。
我已经查看了Railscasts剧集196和197,但是我在使用“accepts_nested_attributes_for”时遇到了问题。此外,这是同一模型的节点之间的关系,那么有没有使用嵌套属性添加和删除字段的方法?
使用Bootstrap和ActiveRecord创建多选菜单有很多帖子。我应该如何使用Neo4j实现这些?
有没有办法通过表单创建关系?如果是这样,那么有没有办法结合nested_attributes方法在创建子事物时创建新的PARENT_OF关系?
对于开放式问题,我们深表歉意。我已经四处寻找了几天,并且非常感谢一些指导,即使你能指出我正确的方向。任何建议都会有帮助。再次感谢。
答案 0 :(得分:0)
我之前没有使用accepts_nested_attributes_for
。我知道我们过去曾讨论过它,但我不记得是否曾经实施过支持。有关this GitHub issue的讨论。也可以随意前往我们的Gitter聊天室。
但你可能不需要它。您应该能够通过has_one
或has_many
的控制器参数在节点上创建关系。如:
Thing.create(name: params[:thing][:name], parent_things: params[:thing][:parents])
params[:thing][:parents]
应该是节点ID数组。然后,当创建节点时,也应该创建所有关系。
当然,您也可以传递thing
的所有参数:
Thing.create(name: params[:thing])
但是根据您的安全情况,您可能希望使用Rails的强参数来确保人们不会传递他们不应该传递的内容。
修改强>
响应您的评论的一些观看代码:
<div class="new-thing-form">
<%= form_for(@thing) do |f| %>
<%= f.text_field :name, placeholder: "Thing Name" %>
<%= text_field_tag 'thing[parent][]', '', placeholder: "Parent Name" %>
<%= text_field_tag 'thing[parent][]', '', placeholder: "Parent Name" %>
<%= f.submit "Create Thing" %>
<% end %>
</div>
f.text_field
代码(我相信)会自动将其作为字段名thing[name]
,因此text_field_tag
也会随之而来。通过将[]
放在最后,你会说这将是一系列父母。因此,参数Hash
应该类似于{thing: {name: 'Foo', parents: ['id1', 'id2']}}