ruby-on-rails 在Rails 7和MongoDB中使用枚举器

yhuiod9q  于 2023-02-10  发布在  Ruby
关注(0)|答案(1)|浏览(126)

我正在用Rails 7和MongoDB 8构建一个新项目,我想对多个字段(状态等)使用枚举器。
我想使用宝石mongoid-enum,但它不与蒙戈8工作。
切换到SQL数据库是一个解决方案吗?或者有其他方法吗?我检查了Mongo的文档,发现了一个Phantom自定义字段类型,但它看起来没有保存在数据库中。在rails控制台中,我将执行Model.status =“open”,然后保存它,它没有返回任何错误。所以我关闭控制台,然后再次打开它。运行Model.status,它返回nil。
谢谢你的阅读和试图帮助我!

nxowjjhe

nxowjjhe1#

首先,MongoDB和PostgreSQL都有好有坏,这取决于你需要的功能类型,请参见:https://www.geeksforgeeks.org/difference-between-postgresql-and-mongodb/
关于Phantom自定义字段类型,这确实与ActiveRecord::Enum做了相同的事情,但需要编写更多的代码。您能分享一下您为测试运行的不工作的代码吗?

编辑日期:2022年2月7日

下面是一个例子,你可以在mongo中使用enum而不需要写太多代码:

module MongoEnum
  # Takes application-scope value and converts it to how it would be
  # stored in the database. Converts invalid values to nil.
  def mongoize(object)
    mapping[object]
  end

  # Get the value as it was stored in the database, and convert to
  # application-scope value. Converts invalid values to nil.
  def demongoize(object)
    inverse_mapping[object]
  end

  # Converts the object that was supplied to a criteria and converts it
  # into a query-friendly form. Returns invalid values as is.
  def evolve(object)
    mapping.fetch(object, object)
  end

  def mapping
    @mapping ||= self.const_get(:MAPPING).freeze
  end

  def inverse_mapping
    @inverse_mapping ||= mapping.invert.freeze
  end
end

class RoleEnum
  extend MongoEnum

  MAPPING = {
    'admin' => 0,
    'user' => 1,
  }.freeze
end

class ColorEnum
  extend MongoEnum

  MAPPING = {
    'black' => 0,
    'white' => 1,
  }.freeze
end

class Profile
  include Mongoid::Document
  field :color, type: ColorEnum
end

class User
  include Mongoid::Document
  field :role, type: RoleEnum
end

免责声明:我没有在一个真实的的应用程序中测试它,让我知道如果它不工作。

相关问题