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前缀
而不是枚举前缀