2 つのモデルとコントローラーが与えられた場合:
りんご
class Apples < ActiveRecord::Base
belongs_to :not_oranges
...
def as_json(options={})
opts = {:include => [:not_oranges]}
super(options.reverse_merge! opts)
end
end
オレンジ
class Oranges < ActiveRecord::Base
belongs_to :not_apples
...
def as_json(options={})
opts = {:include => [:not_apples]}
super(options.reverse_merge! opts)
end
end
検索コントローラー
class SearchController < ApplicationController
a = Apples.search params[:q]
o - Oranges.search params[:q]
@results = {
:apples => a,
:oranges => o
}
respond_to do |format|
format.json { render :json => @results }
end
ご覧のとおり、2 つのモデルはまったく無関係であり、両方:include
の定義に異なるオプションがありますas_json
。
検索クエリがリンゴのみにヒットするか、オレンジのみにヒットする場合、すべてが期待どおりに機能しますが、両方のオブジェクトが空でない場合は、次のようになります。
undefined method `not_apples' for #<Oranges:0x00000004af8cd8>
2 つのas_json
定義がマージされているか、Oranges.as_json
によってオーバーライドされているようApples.as_json
です。
これは予想される動作ですか?RABL のようなものを使用せずに、それを回避するクリーンな方法はありますか? 私のニーズにはやり過ぎだと思います。