我有一张 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::Vote
或User::Vote
。反过来,type
列(Rails 自动填充一个孩子的类名)被设置为 nil,因为它来自Vote
而不是其中一个孩子。
有没有办法让子类继承这个方法并调用它自己,而不是它的父类?