2010-12-01 27 views
2

Est-il possible d'ajouter une colonne virtuelle à un modèle (pas un attribut virtuel!)?Colonnes virtuelles dans un modèle

Je situation suivante: A Product(id, name) a beaucoup ProductVariant(id, price, offer_price, product_id,...)

Lorsque je sélectionne tous les produits que je veux avoir le prix minimum du produit de tous ProductVariants dans le résultat des produits.

@products = Product.with_min_price.order('min_price ASC') 

Je calcule le prix minimum dans une requête SQL (with_min_price) et que vous voulez ajouter cette valeur min_price à chaque Product dans mon @products result.

Répondre

4

Cela pourrait juste être une méthode dans votre classe de produit en supposant que votre has_many produit ProductVarients

#Product Model 

def min_product_price 
    product_variants.map(&:price).min 
end 
+0

Est-ce que cela devrait être 'def self.min_product_price' s'il s'agit d'une méthode de classe? –

+0

oups, ce n'est pas une méthode de classe, c'est une méthode sur l'objet. J'ai mis à jour la réponse. Vous appelez simplement appel @ products.each {| p | p.min_product_price} ' – brycemcd

+0

Merci. J'ai ajouté la méthode de classe à mon modèle. Cela fonctionne trouver – mm1

2

Vous pouvez le faire avec sélectionner la coutume, bien que la colonne est en lecture seule:

>> order = Order.find(:first, :select => "(id+111) as order_number") 
=> #<Order order_number: "119" 
>> order.order_number 
=> "119" 

Vous pouvez également utiliser la nouvelle colonne comme une colonne calculée dans SQL dans l'une des autres parties d'une recherche ou les équivalents Rails 3.

+0

Merci. J'ai trouvé une solution qui fonctionne. Le problème était que j'utilise un SQL min avec un groupe pour calculer le prix minimum. Si j'ai cette requête Category.last.products.with_min_price.order ('category_products.position') la position est manquante dans les sélections. Donc je dois l'ajouter dans cette requête. with_min_price (: et => 'position') – mm1