0

次のRailsコードをDRYするにはどうすればよいですか? typeパラメータはRailsスコープに対応し、それもうまくいくと思っていましallた...しかし、それは配列を返し、私の狡猾な計画は失敗します。

私には間違っているようにif見えますが、allスコープを正しく機能させる方法がわかりません。何か案は?

allスコープとして不適切に依存した元のコード:

def readable(type=:all)
  StudyAid.send(type.to_s).authored_by(self)
end

動作するが醜いバージョン:

def readable(type=:all)
  if type == :all
    StudyAid.authored_by(self)
  else
    StudyAid.send(type.to_s).authored_by(self)
  end
end
4

2 に答える 2

1

メソッドの動作を変更しようとはしませんall。コードの他の部分のセマンティクスが予期せず変更される可能性があり、コードを操作するようになった他の人を驚かせる可能性があるからです。

StudyAidただし、名前付きスコープを別の名前で定義することもできます。

named_scope :every

そして、あなたの方法は次のようになります:

def readable(type=:every)
  StudyAid.send(type).authored_by(self)
end

マイナーポイント:シンボルを使用できるsendため、to_s呼び出しは必要ありません。

最後に、あなたのバージョンはあなたが思っているほど醜いとは思いません。

于 2012-09-07T15:41:12.253 に答える
1

のみを使用したい場合を除き:all、これはおそらくうまくいくはずです:

class StudyAid
  scope :all_recs
end

def readable(type = :all_recs)
...

PS私は最初ではありませんでしたが...

于 2012-09-07T15:42:53.617 に答える