1

Vote多くの子 ( Tag::VoteUser::Vote、など)を持つ STI テーブル ( ) があり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

あるクラスから次のクラスへの唯一の違いは、子のクラス名を参照するときの 2 行目です。

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

このメソッドを親クラスにリファクタリングしたいと思います。2行目を次のように置き換えると、ほとんど機能します。

vote = self.where. . . .

ここでの問題は、またはではなくをself参照することです。次に、列 (Rails が子のクラス名を自動入力する) が nil に設定されます。これは、列が子の1 つではなく、1 つから来ているためです。VoteTag::VoteUser::VotetypeVote

子クラスがこのメソッドを継承し、親ではなく自分自身を呼び出す方法はありますか?

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 に答える