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

标签 ruby-on-rails ruby ruby-on-rails-3

我有一个“事务”(扩展 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/

相关文章:

jquery - Rails UJS 确认框取消按钮回调

ruby - Ruby 中字符串为空后返回 nil

ruby-on-rails - Rails 参数数量错误(1 代表 0),SubscribeController#update 中的 ArgumentError

ruby-on-rails - 将 Rails 应用程序部署到 Heroku 时出错 : simple_form issue

css - 在 Sinatra 中提供静态文件时出现问题

ruby-on-rails-3 - 在 ruby​​ on rails 中渲染备用 View

ruby-on-rails - 使用 Factory Girl 进行测试时处理数据库的正确方法

ruby-on-rails - 管理多个服务器上的不同resque队列

ruby-on-rails - Rails 成熟的管理控制面板

ruby-on-rails - 扩展 strftime 指令以格式化时间,例如 "tomorrow at 14:00"