无法在数据库

时间:2017-01-30 10:57:35

标签: ruby-on-rails enums

在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"。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以使用两种方式。

1)创建模式 l,其中保存 business_categorie

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

my_model = Model.find_by(“business_categot =?”,“恐怖”) Model.books_category [my_model.books_category]#返回整数值

答案 1 :(得分:0)

  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的哈希值
    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。它更简单,并提供更多的灵活性

  7. 进一步阅读:https://hackhands.com/ruby-on-enums-queries-and-rails-4-1/