2012-07-12 24 views
0

給定兩個模型和控制器:Rails的as_json有兩個不相關的模型

蘋果

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 

正如您所看到的,這兩個模型完全不相關,並且兩個模型的as_json定義中的:include選項都不相同。

所有工作正常,如果搜索查詢只命中蘋果或只打橘子,但一旦這兩個對象是不是空的,我得到:

undefined method `not_apples' for #<Oranges:0x00000004af8cd8> 

看起來或者是兩個as_json定義被合併,或者Oranges.as_json正在被覆蓋Apples.as_json

這是預期的行爲?沒有使用類似RABL的東西有沒有乾淨的方法?我覺得這對我的需求來說會過度。

回答

1

在僞碼哈希as_json方法的代碼看起來像

def as_json(options={}) 
    Hash[collect {|key,element| [key.to_s,element.as_json(options)]}] 
end 

但你的元素被修改您傳遞給它的選項參數。哈希不知道這一點,因此將修改後的選項散列傳遞給as json

通常不要修改傳遞給你的參數,除非非常清楚這是好的。我會重寫你的方法

def as_json(options={}) 
    defaults = {:include => :not_apples} 
    super(defaults.merge(options)) 
end 
+0

教我假設紅寶石是因爲它的高水平傳遞值!謝謝。 – Roganartu 2012-07-13 08:26:17

相關問題