【问题标题】:Unable to get the values of enum in database无法获取数据库中枚举的值
【发布时间】:2017-01-30 10:57:34
【问题描述】:

在 Rails 4 中,我创建了一个名为 books 的枚举

enum books_category: {
  horror: 1,
  mystery: 2,
  drama:  3
}

我在数据库中有一个名为 Books 的列,我使用 csv 文件填充了它。我的数据库属性是 name 和 books_category。现在当我升级到rails 5时,数据库的books_category属性直接映射到字符串而不是整数。例如,以前的 books_category 在升级后由 1 组成,它保存了字符串“horror”。我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案1】:

    您可以使用两种方式。

    1) 创建一个 model,保存 business_categories。

    2)当您检索存储恐怖的记录时,您可以将其传递给模型,例如

    my_model = Model.find_by("business_categot = ?","horror") Model.books_category[my_model.books_category] ​​# 返回整数值

    【讨论】:

    • 我想保存整数值而不是查询数据库并找到整数值。有可能吗?
    • 在保存之前有一个查询并将整数值存储在一个变量中,然后使用该值保存数据。
    【解决方案2】:
    1. 首先,您在 books_category 之后缺少一个冒号。代码应如下所示:

      enum books_category: {
        horror: 1,
        mystery: 2,
        drama:  3
      }
      
    2. 请编辑您的问题以包含books_category 属性的数据类型。

    3. 您可以使用字符串或整数来更改值

      book = Book.last
      book.books_category = 1
      book.save!
      => book.books_category = "horror"
      
      book = Book.last
      book.books_category = 'drama'
      book.save!
      => book.books_category = "drama"
      

      请注意,Rails 总是返回字符串值,即使它们以整数数据类型保存。

    4. 你可以通过调用得到所有books_categories的hash

      Book.book_categories
      => {"horror"=>1, "mystery"=>2, "drama"=>3}
      

      键和值通过调用

      Book.book_categories.keys
      => ["horror", "mystery", "drama"]
      

      Book.book_categories.values
      => [1, 2, 3]
      
    5. 最后,你可以得到一个包含horror类别的所有对象(书籍)的列表

      Book.horror
      => Book Load (0.1ms)  SELECT "books".* FROM "books" WHERE "books"."books_category" = ?  [["books_category", 1]]
      

      从查询中可以看出,它使用整数来搜索书籍。

    6. 如果您真的想要枚举的值,请考虑使用Enumerize gem。它更简单,提供更大的灵活性

    延伸阅读:https://hackhands.com/ruby-on-enums-queries-and-rails-4-1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2023-03-28
      相关资源
      最近更新 更多