2011-11-30 25 views
6

Estoy utilizando RABL para generar un conjunto de resultados Sunspot/SOLR y el objeto de resultados de búsqueda está compuesto por varios tipos de modelos. Actualmente dentro de la vista rabl tengo:Rabl Colección de modelos múltiples

object false 

child @search.results => :results do 
    attribute :id, :resource, :upccode 
    attribute :display_description => :description 

    code :start_date do |r| 
    r.utc_start_date.to_i 
    end 

    code :end_date do |r| 
    r.utc_end_date.to_i 
    end 

end 

child @search => :stats do 
    attribute :total 
end 

Lo anterior funciona para un solo modelo; sin embargo, cuando hay varios tipos de modelo dentro de la colección @ search.results, falla porque ambas clases no tienen los mismos métodos de instancia. ¿Alguien sabe cómo tener diferentes atributos basados ​​en el tipo? En última instancia, sería bueno extender condicionalmente una plantilla diferente dentro de la colección de resultados en función del tipo de objeto. Algo así como el pseudo código a continuación:

child @search.results => :results do |r| 
    if r.class == Product 
    extends "product/base" 
    else 
    extends "some other class base" 
    end 
end 

Respuesta

7

Puede tomar el control total con 'nodo' y evitar este problema en su totalidad en el 'peor' caso:

node :results do 
    @search.results.map do |r| 
    if r.is_a?(Product) 
     partial("product/base", :object => r) 
    else # render other base class 
     partial("other/base", :object => r) 
    end 
    end 
end 

¿Ayuda?

+0

Gracias Nathan - ¡eso funcionó a la perfección! Realmente aprecio la ayuda, y lo parcial mantiene las cosas realmente limpias. – ejlevin1

+0

Gracias, esto realmente me ayudó –

Cuestiones relacionadas