Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 检测模型中是否存在作为某物的行?_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 检测模型中是否存在作为某物的行?

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

假设以下模块允许将acts_作为可计时功能添加到任意模型

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) 当然,这是品味的问题。