我有一个有很多孩子的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
而不是其中一个孩子。
子类是否有办法继承此方法并调用自身,而不是其父类?
答案 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