Enums Rails 6:类内的枚举

Enums Rails 6:类内的枚举,enums,rails-activerecord,helper,ruby-on-rails-6,Enums,Rails Activerecord,Helper,Ruby On Rails 6,我正在努力使我的目录在一个类中使用enum,这本图图: 我的模型: **app/models/catalog.rb** class Catalog < ApplicationRecord include ArrayToEnumHash enum state: array_to_enum_hash(CatalogState::STATES) def state @state ||= CatalogState.new(read_attribute(:state)) e

我正在努力使我的目录在一个类中使用enum,这本图图:

我的模型:

**app/models/catalog.rb**
class Catalog < ApplicationRecord
  include ArrayToEnumHash
  enum state: array_to_enum_hash(CatalogState::STATES)

  def state
    @state ||= CatalogState.new(read_attribute(:state))
  end
end
我的目录看起来不错:

#<Catalog:0x00007fe87dbfb810
 id: 3,
 created_at: Thu, 02 Jul 2020 16:52:36 UTC +00:00,
 updated_at: Fri, 03 Jul 2020 19:51:26 UTC +00:00,
 status: "unset",
 auction_type: "internet",
 state: "in_progress">
但是,在我的控制台上,ActiveRecord不生成枚举快捷方式:

[5] pry(main)> c.state
=> "in_progress"
[6] pry(main)> c.in_progress?
NoMethodError: undefined method `in_progress?' for #<Catalog:0x00007fe87dbfb810>
from /Users/pierre/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activemodel-6.0.3.2/lib/active_model/attribute_methods.rb:432:in `method_missing'

WTF?

在catalogs表中添加枚举列不需要那么多

class CreateCatalogs < ActiveRecord::Migration[6.0]
  def change
    create_table :catalogs do |t|
      t.string "status"
      t.string "auction_type"
      t.integer "state"
      t.timestamps
    end
  end
end
这些值将是[incoming,in_progress,finished],否则,使用关注点中的helper方法,它将类似于{:incoming=>incoming,:in_progress=>in_progress,:finished=>finished},Rails无法推断它们所表示的整数值

之后,您可以尝试:

catalog = Catalog.new(id: 3, created_at: 'Thu, 02 Jul 2020 16:52:36 UTC +00:00', updated_at: 'Fri, 03 Jul 2020 19:51:26 UTC +00:00', status: 'unset', auction_type: 'internet', state: 'in_progress')
catalog.valid? # true
catalog.save
Catalog.last
# Catalog Load (0.3ms)  SELECT "catalogs".* FROM "catalogs" ORDER BY "catalogs"."id" DESC LIMIT $1  [["LIMIT", 1]]
# => #<Catalog:0x00007fc4d9448f90 id: 3, status: "unset", auction_type: "internet", state: "in_progress", created_at: Thu, 02 Jul 2020 16:52:36 UTC +00:00, updated_at: Fri, 03 Jul 2020 19:51:26 UTC +00:00>
Catalog.last.in_progress?
# Catalog Load (0.5ms)  SELECT "catalogs".* FROM "catalogs" ORDER BY "catalogs"."id" DESC LIMIT $1  [["LIMIT", 1]]
# => true

我必须问create_enum和t.enum来自哪里?我的目标是创建直接访问方法。为了比整数和数组设置更进一步:我没有设置数组[incoming,in_progress,finished],而是设置哈希{:incoming=>incoming,:in_progress=>in_progress,:finished=>finished},这样我就可以直接访问:my_instance.incoming?=>false,我的_实例。传入!。所以问题是关于助手设置,它似乎是正确的,但不起作用。但是你不需要自己去做。这是由Rails处理的:D,看看。。。bang和predicate方法以及相关的作用域现在都相应地加上了前缀和/或后缀。如果您要对该枚举列进行的使用需要ActiveRecord无法提供的内容,则可以使用gem。否则,我在答案中给出的例子必须足以从它开始。无论如何,你可以这样做,它与gem的使用没有直接联系。不过,我必须提到,如果您要硬编码所有这些Voivodeship,为什么不将它们存储在数据库中?这种方法可能有优点,但也有缺点。值得深思。
[5] pry(main)> c.state
=> "in_progress"
[6] pry(main)> c.in_progress?
NoMethodError: undefined method `in_progress?' for #<Catalog:0x00007fe87dbfb810>
from /Users/pierre/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activemodel-6.0.3.2/lib/active_model/attribute_methods.rb:432:in `method_missing'
class CreateCatalogs < ActiveRecord::Migration[6.0]
  def change
    create_table :catalogs do |t|
      t.string "status"
      t.string "auction_type"
      t.integer "state"
      t.timestamps
    end
  end
end
class Catalog < ApplicationRecord
  enum state: CatalogState::STATES
end
catalog = Catalog.new(id: 3, created_at: 'Thu, 02 Jul 2020 16:52:36 UTC +00:00', updated_at: 'Fri, 03 Jul 2020 19:51:26 UTC +00:00', status: 'unset', auction_type: 'internet', state: 'in_progress')
catalog.valid? # true
catalog.save
Catalog.last
# Catalog Load (0.3ms)  SELECT "catalogs".* FROM "catalogs" ORDER BY "catalogs"."id" DESC LIMIT $1  [["LIMIT", 1]]
# => #<Catalog:0x00007fc4d9448f90 id: 3, status: "unset", auction_type: "internet", state: "in_progress", created_at: Thu, 02 Jul 2020 16:52:36 UTC +00:00, updated_at: Fri, 03 Jul 2020 19:51:26 UTC +00:00>
Catalog.last.in_progress?
# Catalog Load (0.5ms)  SELECT "catalogs".* FROM "catalogs" ORDER BY "catalogs"."id" DESC LIMIT $1  [["LIMIT", 1]]
# => true