ruby-on-rails – 在运行时动态地将模块包含到模型中?
发布时间:2020-12-16 23:14:48 所属栏目:百科 来源:网络整理
导读:我有一个“事务”(扩展ActiveRecord :: Base).我有两种不同类型的交易,即“购买”或“捐赠”.两者之间有足够的重叠,因此不需要创建两个单独的数据库表,因此我只有一个表用于具有“item_type”列的事务. 但是,购买和捐赠有不同的方法和验证,因此将它们分成两
我有一个“事务”(扩展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 然后,您的验证应该工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |