我有一个名为 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/