Rails:在父类方法中获取子类的类名

时间:2013-04-22 13:48:01

标签: ruby-on-rails inheritance self sti

我有一个有很多孩子的STI表(Vote)(Tag::VoteUser::VoteGroup::Vote等。所有子类共享一个非常类似的方法,如下所示:

def self.cast_vote(params)
  value = params[:value]
  vote = Tag::Vote.where(:user_id => User.current.id,
    :voteable_type => params[:voteable_type],
    :voteable_id => params[:voteable_id]).first_or_create(:value => value)
  Vote.create_update_or_destroy_vote(vote, value)
end

当我引用孩子的班级名称时,从一个班级到下一班级的唯一区别在于第二行:

vote = Tag::Vote.where. . . .

我想将此方法重构为父类。当我用第二行代替时,它几乎可以工作:

vote = self.where. . . .

此处的问题是self是指Vote,而不是Tag::VoteUser::Vote。反过来,type列(带有子类名称的Rails自动填充)设置为nil,因为它来自Vote而不是其中一个孩子。

子类是否有办法继承此方法并调用自身,而不是其父类?

1 个答案:

答案 0 :(得分:1)

如果您希望正确设置类型,我认为您不能避免对某个特定子类有所了解,但是您可以简化代码,以便减少代码重复。类似的东西:

class Vote
  def self.cast_vote_of_type(params, subtype)
     ....first_or_create(value: value, type: subtype)
  end
end

class Tag::Vote
  def self.cast_vote(params)
    cast_vote_of_type(params, self.class.name)
  end
end