Neo4jrb:model_class 的枚举器:false
Neo4jrb: Enumerator for model_class: false
当指定 model_class
of false
时,预计从该节点到另一个节点的连接可以是任何其他 class 节点。
是否有互惠枚举器,以便我们可以这样调用:
ActiveNodes.all
何时为用户提供节点选择?
注意(并警告所有考虑此问题的人):查找所有节点根本无法扩展 。
如果您有一个很好的用例,我们肯定会考虑让这更容易。但问题是,此时不会有任何关联可供浏览,因为不涉及模型。那时您可能只想使用 Query
API:
Neo4j::Session.current.query.match(:n).where(n: {foo: 'bar'}).etc...
所有方法的文档都在这里:
http://neo4jrb.readthedocs.io/en/7.0.x/QueryClauseMethods.html
编辑:
正在根据您的评论编辑 post,因为评论空间不足 ;)
您的示例是您有一个 Product
,并且您希望能够找到与相同关系类型链接的其他模型。这是我可能会做的:
class Product
include Neo4j::ActiveNode
has_one :out, :file, type: :RELATED_FILE, model_class: %i(ProductImage ProductVideo ProductPDF)
# optionally
has_one :out, :image_file, type: :RELATED_FILE, model_class: :ProductImage
has_one :out, :video_file, type: :RELATED_FILE, model_class: :ProductVideo
has_one :out, :pdf_file, type: :RELATED_FILE, model_class: :ProductPDF
end
这些也可以更改为 has_many
,如果有多个关联的可能性,它们的工作方式是一样的。
然后你应该能够在视图中生成一个 select 标签,它有所有的选项,它会通过参数将 ID 传递给控制器,然后你可以这样做:
Product.create(name: 'or whatever props you have', file_id: params[:file_id])
如果关联是 has_many
,您可以改为 file_ids: params[:file_ids]
。
您也可以考虑像这样从单个 class 继承那些关联模型:
class File
include Neo4j::ActiveNode
end
class ProductImage < File
# No need to `include Neo4j::ActiveNode`
end
然后你可以像我上面建议的那样做模型数组,或者你可以简单地做:
class Product
include Neo4j::ActiveNode
has_one :out, :file, type: :RELATED_FILE
end
model_class: :File
是根据协会名称假定的。如果你有 has_many
那么你的关联名称将是 :files
并且它仍然会假设 model_class: :File
.
请注意,如果您这样做,关联模型(ProductImage
、ProductVideo
和 ProductPDF
)的节点也都将具有 File
标签因为继承。
作为一个单独的建模建议,我可能只有一个 Image
模型(例如)而不是 ProductImage
,这样模型就可以被重新使用。
当指定 model_class
of false
时,预计从该节点到另一个节点的连接可以是任何其他 class 节点。
是否有互惠枚举器,以便我们可以这样调用:
ActiveNodes.all
何时为用户提供节点选择?
注意(并警告所有考虑此问题的人):查找所有节点根本无法扩展 。
如果您有一个很好的用例,我们肯定会考虑让这更容易。但问题是,此时不会有任何关联可供浏览,因为不涉及模型。那时您可能只想使用 Query
API:
Neo4j::Session.current.query.match(:n).where(n: {foo: 'bar'}).etc...
所有方法的文档都在这里:
http://neo4jrb.readthedocs.io/en/7.0.x/QueryClauseMethods.html
编辑:
正在根据您的评论编辑 post,因为评论空间不足 ;)
您的示例是您有一个 Product
,并且您希望能够找到与相同关系类型链接的其他模型。这是我可能会做的:
class Product
include Neo4j::ActiveNode
has_one :out, :file, type: :RELATED_FILE, model_class: %i(ProductImage ProductVideo ProductPDF)
# optionally
has_one :out, :image_file, type: :RELATED_FILE, model_class: :ProductImage
has_one :out, :video_file, type: :RELATED_FILE, model_class: :ProductVideo
has_one :out, :pdf_file, type: :RELATED_FILE, model_class: :ProductPDF
end
这些也可以更改为 has_many
,如果有多个关联的可能性,它们的工作方式是一样的。
然后你应该能够在视图中生成一个 select 标签,它有所有的选项,它会通过参数将 ID 传递给控制器,然后你可以这样做:
Product.create(name: 'or whatever props you have', file_id: params[:file_id])
如果关联是 has_many
,您可以改为 file_ids: params[:file_ids]
。
您也可以考虑像这样从单个 class 继承那些关联模型:
class File
include Neo4j::ActiveNode
end
class ProductImage < File
# No need to `include Neo4j::ActiveNode`
end
然后你可以像我上面建议的那样做模型数组,或者你可以简单地做:
class Product
include Neo4j::ActiveNode
has_one :out, :file, type: :RELATED_FILE
end
model_class: :File
是根据协会名称假定的。如果你有 has_many
那么你的关联名称将是 :files
并且它仍然会假设 model_class: :File
.
请注意,如果您这样做,关联模型(ProductImage
、ProductVideo
和 ProductPDF
)的节点也都将具有 File
标签因为继承。
作为一个单独的建模建议,我可能只有一个 Image
模型(例如)而不是 ProductImage
,这样模型就可以被重新使用。