【问题标题】:Same enum values for multiple columns多列的相同枚举值
【发布时间】:2015-09-07 23:41:33
【问题描述】:

我需要这样做:

class PlanetEdge < ActiveRecord::Base
  enum :first_planet [ :earth, :mars, :jupiter]
  enum :second_planet [ :earth, :mars, :jupiter]
end

我的表是边表,但每个顶点都是整数。

但是,在 rails 中似乎无法实现上述操作。制作字符串列的替代方法是什么?

【问题讨论】:

标签: ruby-on-rails ruby enums


【解决方案1】:

也许它可以将地球提取为另一个模型?

class Planet < ActiveRecord::Base
  enum type: %w(earth mars jupiter)
end

class PlanetEdge < ActiveRecord::Base
  belongs_to :first_planet, class_name: 'Planet'
  belongs_to :second_planet, class_name: 'Planet'
end

你可以使用accepts_nested_attributes_for创建一个PlanetEdge:

class PlanetEdge < ActiveRecord::Base
  belongs_to :first_planet, class_name: 'Planet'
  belongs_to :second_planet, class_name: 'Planet'

  accepts_nested_attributes_for :first_planet
  accepts_nested_attributes_for :second_planet
end

PlanetEdge.create(
  first_planet_attributes: { type: 'mars' },
  second_planet_attributes: { type: 'jupiter' }
)

【讨论】:

  • 你能举个例子说明你会如何用这种方式创建()一个 PlanetEdge 吗?
  • 我更新了答案。如果这看起来太复杂,你也可以写一些像create_for_planets(first_planet_type, second_planet_type)这样的方法,它会完成所有的工作
【解决方案2】:

如果您根据 http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html 运行 rails 5.0 或更高版本

当您需要定义具有相同值的多个枚举时,可以使用 :_prefix 或 :_suffix 选项。如果传递的值为 true,则方法以枚举名称为前缀/后缀。也可以提供自定义值:

class Conversation < ActiveRecord::Base
    enum status: [:active, :archived], _suffix: true
    enum comments_status: [:active, :inactive], _prefix: :comments
end

在上面的例子中,bang 和 predicate 方法以及相关的作用域现在被相应地添加前缀和/或后缀:

conversation.active_status!
conversation.archived_status? # => false

conversation.comments_inactive!
conversation.comments_active? # => false

【讨论】:

  • 这仅适用于rails版本> 5
  • 如果你想对两个不同的列使用相同的枚举,你会怎么做?
  • 让我大吃一惊的是官方文档没有在参数_suffix_prefix 前加上下划线。然而,代码依赖于存在的下划线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2014-09-19
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多