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

时间:2014-05-17 14:32:12

标签: ruby-on-rails ruby-on-rails-4

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

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",但这会生成一个实例方法   "星期一?",已经由另一个枚举定义。

我该如何解决这个问题?

3 个答案:

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

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

祝你好运!