2012-07-12 41 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