【问题标题】:How can I implement enum in a graph database like Neo4j?如何在 Neo4j 等图形数据库中实现枚举?
【发布时间】:2015-12-22 16:12:56
【问题描述】:

我想为Neo4j 实现一个enum。在ActiveRecord 上很容易,就像

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

如何在 Neo4j 中实现这一点?

【问题讨论】:

  • 我很失望,不知道为什么我对此投了反对票。我真的面临这个问题,有人可以帮我解决这个问题。如果我无法正确解释这个问题,是否应该有人添加评论?

标签: ruby-on-rails enums neo4j nosql


【解决方案1】:

Neo4j 驱动程序现在支持枚举,因此您可以这样做:

class Media
  include Neo4j::ActiveNode

  enum type: [:image, :video, :unknown]
end

media = Media.create(type: :video)
media.type
# => :video
media.image!
media.image?
# => true

查看文档了解更多详情:http://neo4jrb.readthedocs.io/en/8.1.x/ActiveNode.html?highlight=default#enums

【讨论】:

    【解决方案2】:

    neo4j gem 尚不支持此功能,但我认为这可能是个好主意。如果你同时想要它,你可以在你的模型中实现一个Concern,你可以include

    我还创建了一个建议实施此问题的问题:https://github.com/neo4jrb/neo4j/issues/1082

    【讨论】:

      【解决方案3】:

      感谢 Brian Underwood 的建议。我已通过在 lib/enum_attr.rb 中创建一个模块来实施该解决方案。

      我有一个模型user.rb,我必须在其中实现枚举,所以我在其中创建了enum_attr 方法

        class User
          enum_attr status: [ :active, :archived ]
        end
      

      添加模块lib/enum_attr.rb

        module ClassMethods
          def enum_attr(attr_list)
            attr_list.each do |list|
              enum_name, enum_data = list.first, list.second
      
              enum_data.each_with_index do |method_name,value|
                define_method("#{method_name}?") do
                  enum_value = self.send(enum_name)
                  enum_value.nil? ? false : enum_data[enum_value] == method_name
                end
      
                define_method("#{method_name}!") do
                  self.write_attribute(enum_name, value)
                  self.save
                end
              end
            end
          end
        end
      

      说明:

      我添加了两个方法。第一个设置值

      user = User.first
      user.active! # sets the user to active with value 0 
      

      第二个返回一个布尔方法来检查它的状态

      user.active? # returns true/false as per the result
      user.archived? #returns false if it it set to active
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多