我需要知道是否可以将模块包含到实例化模型中。
今天有用:
控制器中的
@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
(在那里)。
但我真的认为这不是一个好主意......
知道如何以一种好的方式真正做到这一点吗?
谢谢!
答案 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