【发布时间】:2020-03-31 04:15:30
【问题描述】:
我正在构建一个 Ruby on Rails 应用程序,其中我的模型属性是静态的,例如 Gender 和 Status。我决定在模型中将它们定义为enums。我正在使用ruby-enum gem 来定义枚举。
我已将ruby-enum gem 添加到我的项目中,并运行bundle install:
gem 'ruby-enum', '~> 0.8.0'
但是,枚举需要被其他各种模型访问,所以我在模型的 concerns 目录中将枚举定义为 modules:
# app/models/concerns/status.rb
module Status
extend ActiveSupport::Concern
included do
include Ruby::Enum
define :ordered, 'Ordered'
define :cancelled, 'Cancelled'
define :waiting, 'Waiting'
end
end
我已将此模块包含在我的 Users 模型中
class User < ApplicationRecord
include Status
end
我的Users 模型有一列status:
create_table "users", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.string "status"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
但是当我查询rails console中的Status模块时:
Status.all
我得到错误:
NoMethodError (undefined method `all' for Status:Module)
当我还在 rails 控制台中查询 User 模型以获取所有 statuses 时:
User.statuses.all
我得到错误:
ArgumentError (wrong number of arguments (given 2, expected 0..1))
我也不知道如何在视图中使用它
# app/views/users/_form.html.erb
<%= form.label :status %><br />
<%= form.select :status, User.statuses.keys.collect { |status| status },{} %>
对于如何定义枚举并在用户的表单视图中返回枚举的键值以便可以在表单中选择状态,我将不胜感激。谢谢。
【问题讨论】:
-
Rails already has enums。
User.statuses定义在哪里? -
问题是我想对枚举使用哈希方法,这样键
order可以为Order赋值,我在 rails 枚举中没有看到,它使用整数。另外,我没有在任何地方定义User.statuses。我只是在尝试如何查询Users表以获取所有statuses。 -
映射到字符串的枚举有什么意义?你想达到什么目的?如果要存储状态的显示方式,那就是decorator 的工作。或者考虑使用
user.status.humanize。请注意,Rails 枚举在加载时会在整数和字符串之间进行映射。 -
我想在视图页面中查看
Order而不是order之类的枚举值。我想在视图页面中看到Not ordered而不是not_ordered。我还希望将status的值存储在数据库中,而不是像0, 1, 2这样的整数。 -
我建议使用 Rails 的内置枚举功能并使用支持性 gem,例如 rubydoc.info/gems/translate_enum/0.1.3
标签: ruby-on-rails ruby enums