ruby-on-rails – 在运行时动态地将模块包含到模型中?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在运行时动态地将模块包含到模型中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个“事务”(扩展ActiveRecord :: Base).我有两种不同类型的交易,即“购买”或“捐赠”.两者之间有足够的重叠,因此不需要创建两个单独的数据库表,因此我只有一个表用于具有“item_type”列的事务.

但是,购买和捐赠有不同的方法和验证,因此将它们分成两个不同的控制器和模型是有意义的.我没有创建ActiveBase模型(减去表格),而是尝试为每个模型使用模块.

以下是Purchase模块的外观.

module Purchase
  def self.included(base)
    base.validates :amount,:presence => true
  end

  def testing
    "testing"
  end
end

以下是如何创建一个:(此代码位于Purchases控制器的create操作中)

@purchase = Transaction.new(params[:purchase]).extend(Purchase)

我可以打电话给@ purchase.testing,然后返回“测试”.但是,该验证尚未运行.

如果我在交易模型上以传统方式包含模块,使用“包含购买”,那么它们就可以工作.

我有什么想法可以让这个工作流程发生?我跟着这个:http://paulsturgess.co.uk/articles/84-how-to-include-class-and-validation-methods-using-a-module-in-ruby-on-rails

解决方法

如果您只想使用单个表和多个列,我认为首选方法是单表继承.如果搜索单表继承,可以阅读它 here.关于你的问题,关于如何包含模块,我想你会想要将模块包含在@purchase的元类中,所以它不包含在所有后续的事务中.像这样(绝对可以缩短):
@purchase = Transaction.new(params[:purchase])
class << @purchase
  include Purchase
end

然后,您的验证应该工作.

猜你在找的Ruby相关文章