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

Ruby on rails 使用多个属性共享枚举声明值,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我希望有一个具有多个属性的类,可以用数值保存工作日 summary_weekday :integer collection_weekday :integer 我想我可以通过两个声明将整数映射到值: enum summary_weekday: %w(monday tuesday wednesday thursday friday saturday sunday) enum collection_weekday: %w(monday tuesday wednesday thursday fr

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

summary_weekday    :integer
collection_weekday :integer
我想我可以通过两个声明将整数映射到值:

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


如何解决此问题?

无法通过获取您要查找的内容,因为它将尝试为两个枚举创建类似
object.tuday?
的方法,这在逻辑上是错误的

我记得正是这种支持。对于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
上面的代码可能需要一些混乱,而打字等,我知道这不是一个通用的证明,我真的很想知道任何更好的解决方案,为这个有趣的问题;肯定会非常有用

礼貌-


希望这有帮助。

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

class Invoice < ActiveRecord::Base
  enum verification: [:done, :fail], _prefix: true
end
class发票
还可以提供自定义前缀

class Invoice < ActiveRecord::Base
  enum verification: [:done, :fail], _prefix: :verification_status
end
class发票
如果人们仍在寻找Rails 4的解决方案,我前几天刚刚尝试过,它似乎效果不错。 我需要一个类似的系统来工作,因为管理员必须对一个对象进行各种检查。 我通过创建一个模型关注点并在模型中使用class方法解决了这个问题:

在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_")
classmodelname
这似乎可以进行所有正确的数据库查询


祝你好运

我不明白这怎么可能。枚举特性的全部要点是提供这些快捷方式;
monday?
什么时候可以同时应用于
summary_weekday
collection_weekday
?为什么需要两个相同值的定义?不能定义两个具有相似值的枚举属性。这就是为什么您会收到一条冲突错误消息。问题不是关于“相同值的两个定义”,而是关于共享相同枚举类型的多个字段。Boolean是true/false的枚举,我们可以有多个布尔字段,而无需activerecord插入一组相互冲突的#true?/#假的?方法。提醒:可能会发生正确的枚举:看起来这是在Rails 5中添加的。此处已经记录了:。我们将对
\u后缀
\u前缀
选项进行测试,@MarioPérez是正确的,您应该使用
\u前缀
而不是
枚举前缀