rails - 实例模型包括可变条件下的模块

时间:2016-02-16 14:55:38

标签: ruby-on-rails ruby-on-rails-4 model module

我需要知道是否可以将模块包含到实例化模型中。

今天有用:

控制器中的

@m = MyModel.create(params)
模型中的

class Doc < ActiveRecord::Base

   after_save :set_include

   def set_include
     if bool
       self.class.send(:include, Module1)
     else
       self.class.send(:include, Module2)
     end
   end

end

这是有效的,但我担心self.class实际上包含了类模型的模块,而不是实例化模型

在这种情况下,这将起作用。 保存对象后调用模块方法。

但在很多情况下,控制器会调用一些模块方法。

我想到在控制器的set_include中调用方法before_action(在那里)。 但我真的认为这不是一个好主意......

知道如何以一种好的方式真正做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您需要使用实例类(a.k.a eigenklass):

def set_include
  singleton_class.instance_eval do
    include bool ? Module1 : Module2
  end
end

然而,您想要这样做的事实是可疑的并且可能导致灾难。所以问题是:你真正想要在这里实现什么 - 肯定有更好的方法。

答案 1 :(得分:0)

回答您的直接问题是。您的代码似乎只能正常工作,实际上修改类的实例,而类本身。所以它的所有实例都将得到这个&#34;好处&#34;。可能不是你想要的。让我用简单的ruby示例演示:https://repl.it/BnLO

您可以执行的操作是使用extend,例如:https://repl.it/BnLO/2

应用于您的代码:

class Doc < ActiveRecord::Base
   after_save :set_include

   def set_include
     if bool
       extend(Module1)
     else
       extend(Module2)
     end
   end
end

此外,self不是必需的。 https://repl.it/BnLO/3