1

我有一张 STI 表 ( Vote),里面有很多孩子 ( Tag::Vote, User::Vote,Group::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而不是其中一个孩子。

有没有办法让子类继承这个方法并调用它自己,而不是它的父类?

4

1 回答 1

2

如果您希望正确设置类型,我认为您无法避免对特定子类有所了解,但是您可以简化代码,从而减少代码重复。就像是:

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
于 2013-04-22T14:14:44.987 回答