我希望有一个具有多个属性的类,可以使用数值保存工作日。
summary_weekday :integer
collection_weekday :integer
我以为我可以使用两个声明将整数映射到值using Enum:
enum summary_weekday: %w(monday tuesday wednesday thursday friday saturday sunday)
enum collection_weekday: %w(monday tuesday wednesday thursday friday saturday sunday)
但是Rails并不接受,我不能在同一个类中两次定义相同的值。
您尝试定义名为" summary_weekday"的枚举。在模型上 " QuestionCategory",但这会生成一个实例方法 "星期一?",已经由另一个枚举定义。
我该如何解决这个问题?
答案 0 :(得分:21)
从Rails 5.0开始,当您需要定义具有相同值的多个枚举时,可以使用_prefix
或_suffix
选项。如果传递的值为true,则这些方法以枚举的名称作为前缀/后缀。
class Invoice < ActiveRecord::Base
enum verification: [:done, :fail], _prefix: true
end
也可以提供自定义前缀。
class Invoice < ActiveRecord::Base
enum verification: [:done, :fail], _prefix: :verification_status
end
答案 1 :(得分:7)
enum
无法获取您要查找的内容,因为它会尝试为两个枚举创建object.tuesday?
等方法,这在逻辑上是错误的。< / p>
我记得DataMapper ORM得到了这种支持。对于ActiveRecord,您可能需要手动为这些属性创建 getter 和 setter 方法并将其映射到那里,如:
WEEKDAYS = %w(monday tuesday wednesday thursday friday saturday sunday)
def summary_weekday
WEEKDAYS[read_attribute(:summary_weekday).to_i]
end
def summary_weekday=(value)
write_attribute(:summary_weekday, WEEKDAYS.index(value.to_s))
end
上面的代码在进行类型转换时可能需要进行一些修改。我知道这不是一个通用的证明,我真的很想知道这个有趣问题的任何更好的解决方案;肯定会非常有用。
礼貌 - Ruby Forum
希望这有帮助。
答案 2 :(得分:0)
如果人们仍然在寻找Rails 4的解决方案,那我前几天就尝试了这个,它似乎运行良好。 我需要一个类似的系统才能工作,因为管理员必须对一个对象进行各种检查。 我通过创建模型关注并使用模型中的类方法来解决它:
在models / concerns / review_states.rb
中require 'active_support/concern'
module ReviewStates extend ActiveSupport::Concern
class_methods do
REVIEW_STATES = {not_initiated:0, in_progress:1, completed:2}
SIGNUP_STATES = {pending:0, activated:1, disabled:2}
def prefix_review_states(prefix)
Hash[REVIEW_STATES.map { |k,v| [k.to_s.prepend(prefix).to_sym, v] }]
end
end
end
在你的模特中:
class ModelName < ActiveRecord::Base
include ReviewStates
enum one_status: prefix_review_states("one_")
enum two_status: prefix_review_states("two_")
这似乎可以使所有正确的数据库查询。
祝你好运!