使用多个属性共享枚举声明值
我希望有一个具有多个属性的类,可以使用数值保存工作日。
summary_weekday :integer collection_weekday :integer
我以为我可以使用带有两个声明的Enum将整数映射到值:
enum summary_weekday: %w(monday tuesday wednesday thursday friday saturday sunday) enum collection_weekday: %w(monday tuesday wednesday thursday friday saturday sunday)
但Rails不接受,我不能在同一个类中定义两次相同的值。
您尝试在模型“QuestionCategory”上定义名为“summary_weekday”的枚举,但这将生成一个实例方法“monday?”,该方法已由另一个枚举定义。
我怎么解决这个问题?
从Rails 5.0 _suffix
当需要定义具有相同值的多个枚举时,可以使用_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
你想要的是enum
无法获得的,因为它会尝试创建像object.tuesday?
这样的方法object.tuesday?
两个枚举 ,这在逻辑上是错误的。
我记得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论坛
希望这可以帮助。
如果人们仍然在寻找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_")
这似乎使所有正确的数据库查询。
祝好运!