从非重载方法调用时使用class_attribute

时间:2018-06-11 12:07:45

标签: ruby-on-rails ruby

请参阅下面的代码,您将了解我要实现的目标:

class Buchung(models.Model):
TIME_CHOICES = (
    ('Ganztag', 'Ganztag'),
    ('Halbtags vor 14', 'Halbtags vor 14'),
    ('Halbtags nach 14', 'Halbtags nach 14'),
)


cearted_on = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(Mitarbeiter, on_delete=models.CASCADE, default='')
raum = models.ForeignKey(Raum, on_delete=models.CASCADE, default='')
platz = models.ForeignKey(Platz, on_delete=models.CASCADE, default='')
time_choices = models.CharField(max_length=100, choices=TIME_CHOICES, default='Ganztag')
datum = models.DateField(("Datum"), default=datetime.date.today)
token = models.CharField(max_length=300, default='')

def __str__(self):
    return "%s am %s" % (self.user, self.datum)

我没有得到任何输出。如果other_func的名字很有趣,它会在rails控制台上打印“我的名字”。从other_func调用时如何实现同样的目的?

编辑在我的Child课程中已经有了一个方法

class Parent
  class_attribute :name
  def self.fun
    puts name
  end
end

class Child < Parent
  self.name = "my name"
  def self.other_func
    self.superclass.fun
    # or Parent.fun
  end
end

Child.other_func

在调用def self.fun 之前做了一些额外的工作。所以,从'other_func'直接调用'fun'对我来说不是一个选择。

1 个答案:

答案 0 :(得分:3)

尽管成功调用了nil,但您确实将Parent.fun作为输出。

事情是class_attribute不起作用,因为你期望它起作用。这将揭示这个问题:

class Parent
  class_attribute :name
  self.name = :super
  def self.fun
    puts "super: #{self.name}"
  end
end

class Child < Parent
  self.name = :child
  def self.fun
    puts 'child'
  end 
  def self.other_fun
    Parent.fun
  end
end

Child.other_fun
#⇒ super: super

也就是说,类属性不是派生的