Ruby on rails 检测模型中是否存在作为某物的行?
假设以下模块允许将acts_作为可计时功能添加到任意模型Ruby on rails 检测模型中是否存在作为某物的行?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,假设以下模块允许将acts_作为可计时功能添加到任意模型 module Timeable module ActsAsTimeable extend ActiveSupport::Concern module ClassMethods def acts_as_timeable(options ={}) ... end end end end ActiveRecord::Base.send :include, Timeabl
module Timeable
module ActsAsTimeable
extend ActiveSupport::Concern
module ClassMethods
def acts_as_timeable(options ={})
...
end
end
end
end
ActiveRecord::Base.send :include, Timeable::ActsAsTimeable
根据最后一行,acts_as_timeable类方法在ActiveRecord::Base中可用。因此,任何扩展形式为ActiveRecord::Base的模型在调用model.response\u to?(:acts\u as\u timeable)=>true
时都将返回true
如何根据以开头的行是否作为\u timeable来检测模型是否实际作为\u timeable
class Model < ActiveRecord::Base
acts_as_timeable
end
类模型
…(可能还有一些选项)是否已添加到模型中?我认为最简单的方法是在模型类本身上设置此状态 在
acts\u as\u timeline
中,您可以设置一个类变量,并通过访问器将其公开,如下所示:
module ClassMethods
def timeable?
!!@timeable
end
def acts_as_timeable(options = {})
@timeable = true
# Rest of your code
end
end
然后,您只需使用
MyModel.timeable?
检查即可。谢谢,这是一个有效的选项。。。我这里有两个问题:1.)我认为@name表示实例变量,@name表示类变量。如果我是对的,您定义了一个实例变量,但我们需要一个类变量。我试图用@@作为变量timeable的前缀,但调用MyModel.timeable时会导致NameError?诀窍在哪里?2.“!!”到底是什么意思?再次感谢您…1)您是对的,这是实例变量,但它们是类上的实例变量,因为您的模块ActsAsTimeAble::ClassMethods已扩展到类中。2) !! 强制结果为真或假!(假值)=真!那你就错了。还要看以下要点:1)好的,但是在类上添加它作为类变量不是更好吗?即使我们选择将其添加为实例变量,一般来说,我们是否应该在模块ActsAsTimeable内部但在模块ClassMethods外部定义实例变量?2.)好的,我认为更好的解释是将返回值“nil”(如果acts_as_timeable在MyModel中不存在,因此没有声明实例变量“timeable”)时返回)转换为布尔值……1)类变量在继承方面很棘手-我通常在类方法中定义实例变量时避免使用它们,此实例变量将成为类上的实例变量。类是ruby中的对象。这意味着类,比如说MyModel
(它是一个类的实例),获得这个实例变量和方法timeable?
。此代码每个类只运行一次timeable?
对于未设置@timeable的类返回nil。2) 当然,这是品味的问题。