使用多个属性共享枚举声明值

我希望有一个具有多个属性的类,可以使用数值保存工作日。

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,您可能必须手动为这些属性创建gettersetter方法并将其映射到那里,例如:

 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_") 

这似乎使所有正确的数据库查询。

祝好运!