我有一个“事务”(扩展 ActiveRecord::Base)。我有两种不同类型的交易,“购买”或“捐赠”。两者之间有足够多的重叠,因此无需创建两个单独的数据库表,因此我只有一个表用于包含“item_type”列的交易。
但是,购买和捐赠有不同的方法和验证,因此将它们分成两个不同的 Controller 和模型是有意义的。我没有创建 ActiveBase 模型(减去表格),而是尝试为每个模型使用模块。
这是 Purchase 模块的样子。
module Purchase
def self.included(base)
base.validates :amount,
:presence => true
end
def testing
"testing"
end
end
以下是创建方式:(此代码位于 Purchases Controller 的创建操作中)
@purchase = Transaction.new(params[:purchase]).extend(Purchase)
我可以调用@purchase.testing 并返回“testing”。但是,该验证并未运行。
如果我以传统方式将模块包含在交易模型中,并使用“include Purchase”,那么它们就可以工作。
关于如何实现此工作流程的任何想法?我稍微关注了一下: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-on-rails - 在运行时将模块动态包含到模型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369270/