ruby-on-rails - 如何抽象Rails中多个模型使用的枚举属性?

标签 ruby-on-rails activerecord activesupport-concern

我有一个名为 currency 的数据库属性被多个模型使用。我想创建一个关注点(或类似的)来定义 currency 的基本功能属性。如果它仅用于单个模型,我可能会这样做:

class Transaction < ApplicationRecord
  enum currency: [ :USD, :AUD ] 
  validates :currency, inclusion: { in: currencies.keys }
end

但由于它被多个模型使用,我想做这样的事情:

class Transaction < ApplicationRecord
  include Currency # maybe in a Concern?
  acts_as_currency :currency
end

整个想法是能够做类似 Transaction.first.currency.USD? 的事情以及枚举属性具有的类似功能,以及在单个位置定义属性验证。

您将如何使用 Rails 进行设计?有什么首选方法吗?

最佳答案

在 Ruby 中,共享行为需要模块,ActiveSupport 关注点提供了很酷的语法糖,e.g. included

# app/models/concerns/has_currency.rb
module HasCurrency
  extend ActiveSupport::Concern
  included do
    enum currency: [ :USD, :AUD ] 
    validates :currency, inclusion: { in: currencies.keys }
  end
end

class Transaction < ApplicationRecord
  include HasCurrency
end

我们可以通过使用函数来为我们关注的用户提供更多自由,正如您所建议的:

# app/models/concerns/has_currency.rb
module HasCurrency
  def acts_as_currency(column = :currency)
    enum column => [ :USD, :AUD ] 
    validates column, inclusion: { in: column.to_s.pluralize.keys }
  end
end

class Transaction < ApplicationRecord
  extend HasCurrency # Note the `extend`, not `include`
  acts_as_currency
end

关于ruby-on-rails - 如何抽象Rails中多个模型使用的枚举属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57384140/

相关文章:

sql - ActiveRecord:按组计数

ruby-on-rails - 将参数传递给关注点,联合使用

ruby-on-rails - Rails 关注方法覆盖另一个关注方法不像普通模块那样工作

ruby-on-rails - 如何停止 heroku db 进程

mysql - 按关联模型中的列对 Rails 数据库表进行排序

ruby-on-rails - Rails Devise 限制管理员用户的 IP 地址访问

ruby-on-rails - `include` 启用 ActiveRecord 与附加位置的关联

mysql - SQL 'IN' 和 'NOT IN' 在一起

html - 自定义 collection_check_boxes

ruby - 如何设置可以在 Rails 中的 Controller 和模型中访问的 "global"变量