Ordenar por campos virtuales

Buenas, un saludo al foro.

Tengo la siguiente estructura de tablas en mi aplicacion:

productos:
id
nombre
fabricante_id
categoria_id
descuento

medidas:
id
ancho
largo
precio
producto_id

en los modelos rails de estas tablas tengo lo siguiente:

producto
has_many :medidas,:dependent=>:destroy,:order=>“precio”

medida
belongs_to :producto

Necesito ordenar los productos por precio, lo que quiere decir que de
cada producto debo hallar la medida con el precio menor y luego
aplicarle el descuento, lo que implica acceder a las 2 tablas.

Lo he solucionado de la siguiente manera a nivel de controlador:

Producto.paginate :page =>
params[:page],:conditions=>conditions,:select=>"productos.*,(min(medidas.precio)

  • ( min(medidas.precio)*(productos.descuento/100) ) ) AS
    precio_min",:joins=>"left join medidas on
    productos.id=medidas.producto_id ",:group=>"productos.id
    ",:order=>“precio_min DESC”
  • No he utilizado :include=>“medidas” porque por lo visto si usas la
    opcion :include se ignora la opcion :select.

Bien, esto me funciona perfectamente pero me preguntaba si habia alguna
forma a nivel de modelo para poder acceder siempre al campo virtual
precio_min.

He pensado en sobrescribir el metodo find pero se me complica bastante
por lo que comentaba anteriormente de la opcion include.

Todo esto viene a raiz de que estoy usando el plugin activescaffold y me
seria muy comodo poder ordenar a nivel de modelo sin tener que volver a
implementarlo
en los controladores.

O sea tener siempre accesible :order=>“precio_min”

Al final me ha quedado un post bastante coñazo, en fin a ver si alguien
me echa una mano, un saludo.

Alfredo

Alfredo Garcia lopez wrote:

Bien, esto me funciona perfectamente pero me preguntaba si habia alguna
forma a nivel de modelo para poder acceder siempre al campo virtual
precio_min.

He pensado en sobrescribir el metodo find pero se me complica bastante
por lo que comentaba anteriormente de la opcion include.

Todo esto viene a raiz de que estoy usando el plugin activescaffold y me
seria muy comodo poder ordenar a nivel de modelo sin tener que volver a
implementarlo
en los controladores.

O sea tener siempre accesible :order=>“precio_min”

Al final me ha quedado un post bastante coñazo, en fin a ver si alguien
me echa una mano, un saludo.

Alfredo

Tal vez puedas implementar un metodo para que te regrese los registros
ordenandos desde el modelo… algo como:

def self.find_ordered_by_precio_min
find(:all, :include => :medidas).sort {|p1, p2| p1.precio_min <=>
p2.precio_min}
end

Y precio_min es el atributo virtual en donde haces tus calculos:

def precio_min

tus calculos aqui

end