使用self来指代最高级别

时间:2013-11-19 22:23:00

标签: ruby-on-rails ruby rails-activerecord

如何使用self上两节课?例如,我有以下代码:

class Project < ActiveRecord::Base
    class Current
        self.state = true
    end
end

我需要self.state来指代项目的州,而不是当前的州。如何使用self来引用Project

更新:经过多次评论后,我正在重新编写代码以使问题更容易:

我需要在Current类中引用Project的当前实例。根据我的理解,上面的代码是不正确的,这应该是如何做到的:

class Project < ActiveRecord::Base
    class Current
        change_state
    end

    def change_state
        self.state = true
    end
end

但是,当我使用此代码时,我收到错误:

undefined local variable or method `change_state' for #<current:0x007fd13953ee60>

我的问题基本相同,我如何在Current中引用Project的当前实例?

2 个答案:

答案 0 :(得分:1)

听起来你正在把一个班级放在另一个班级里面这样:

class Alice < ActiveRecord::Base
  class Bob
  end
end

执行此操作时,Bob不是Alice ActiveRecord :: Base的子类。 Bob只是Object的子类。 Alice和Bob之间的唯一关系是你通过编写Alice :: Bob来访问Bob。要使Bob成为Alice的子类,您必须像这样定义它:

class Bob < Alice
end

如果你这样做,Bob将继承Alice的方法。如果你愿意,你仍然可以把它放在Alice的命名空间里,但重要的是你使用class Bob < Alice所以Ruby知道你希望Bob成为Alice的子类,而不仅仅是在她的命名空间中挂出一个不相关的类。

答案 1 :(得分:0)

您的代码格式不正确。当你第一次执行外部class的主体作为定义该类的一部分时,你得到的错误来自Ruby解释器,作为其中的一部分,执行内部类的主体作为定义的一部分< em>那个类。此时未定义change_state,因此类定义失败。

这是一个简单的例子:

class Foo
  puts 1
  class Bar
    baz
  end
  puts 2
end

如果您在irb中执行此操作,则会看到1已打印出来,然后您会收到有关baz未定义的错误消息。此时尚未调用FooBar。这些类正在被定义,因此它们无法实例化。