QA@IT

Mongoidでコンストラクタをオーバライドするには?

1821 PV

現在Mongoidを使っているのですが、コンストラクタをどうやってオーバライドすればいいかわかりません。
まず最初コンストラクタに何も書かなかった場合はプログラム実行中にエラーをはきました。
そこでsuperを使いたい所ですが、継承をしていないので呼び出せないように感じます。でもなぜか動きます。
しかしながらinitializeに引数を渡されると、エラーをはいてしまいます。

コードで説明させていただきます。

class Project
  include Mongoid::Document
  include Mongoid::Timestamps

  def initialize
     super
     @hoge = "hello"
  end
end


Project.new(params[:project])#エラー

なぜ継承していないのにsuperがかけるのでしょう?
またこの用に引数を取る場合はどのように対処すればいいのでしょうか?

回答

Project.ancestorsにMongoid::DocumentとMongoid::Timestampsが入ってますよね。includeしたmoduleも継承されることになるのでメソッドもオーバーライドすればsuperで呼べます。
superだと引数まるごと上に投げるので上と引数が違えばエラーになります。なのでsuper()で明示的に引数渡さない呼び出しにすれば行けるんじゃないでしょうか。

class Project
  include Mongoid::Document
  include Mongoid::Timestamps

  def initialize(params)
     super()
     @params = params
  end
end


Project.new(params[:project])
編集 履歴 (0)
  • お返事ありがとうございます。
    なるほど、このincludeがMix-Inと呼ばれるものだったんですか、とても便利ですね。あとsuperに対してどのような引数を与えればいいか分からなかったんですが、動的な型付けなのでそのままわたせばよかったんですね。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。