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

Num*_*ers 29 ruby-on-rails ruby-on-rails-4

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

summary_weekday    :integer
collection_weekday :integer
Run Code Online (Sandbox Code Playgroud)

我以为我可以使用带有两个声明的Enum将整数映射到值:

enum summary_weekday: %w(monday tuesday wednesday thursday friday saturday sunday)
enum collection_weekday: %w(monday tuesday wednesday thursday friday saturday sunday)
Run Code Online (Sandbox Code Playgroud)

但Rails不接受,我不能在同一个类中两次定义相同的值.

您尝试在模型"QuestionCategory"上定义名为"summary_weekday"的枚举,但这会生成一个实例方法"monday?",该方法已由另一个枚举定义.

我怎么解决这个问题?

小智 22

从Rails 5.0开始,当需要定义具有相同值的多个枚举时,可以使用_prefix_suffix选项.如果传递的值为true,则方法的前缀/后缀为枚举的名称.

class Invoice < ActiveRecord::Base
  enum verification: [:done, :fail], _prefix: true
end
Run Code Online (Sandbox Code Playgroud)

也可以提供自定义前缀.

class Invoice < ActiveRecord::Base
  enum verification: [:done, :fail], _prefix: :verification_status
end
Run Code Online (Sandbox Code Playgroud)

  • 已在此处记录:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html.我们将有`_suffix`和`_prefix`选项 (6认同)
  • 看起来这是在Rails 5中添加的. (2认同)

kid*_*ils 7

您正在寻找的是无法获得的enum,因为它会尝试创建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
Run Code Online (Sandbox Code Playgroud)

上面的代码可能需要一些修改,而类型转换等.我知道这不是一个通用的证据,我真的很想知道这个有趣的问题的任何更好的解决方案; 肯定会非常有用.

礼貌 - Ruby论坛

希望这可以帮助.