2010-11-03 7 views
1

Je rencontre des problèmes de RoR avec certaines méthodes de modélisation que je définis. J'essaie de construire une méthode sur un modèle, avec un argument qui reçoit une valeur par défaut (nil). L'idéal est que si une valeur est passée à la méthode, elle fera autre chose que le comportement par défaut. Voici la configuration:Méthode ignorant la valeur du paramètre dans Ruby on Rails, en utilisant la valeur par défaut à la place

J'ai actuellement quatre modèles: marché, Deal, Merchant et BusinessType

Les associations se présentent comme suit:

class Deal 
    belongs_to :market 
    belongs_to :merchant 
end 

class Market 
    has_many :deals 
    has_many :merchants 
end 

class Merchant 
    has_many :deals 
    belongs_to :market 
    belongs_to :business_type 
end 

class BusinessType 
    has_many :merchants 
    has_many :deals, :through => :merchants 
end 

Je suis en train de tirer des données en fonction du type d'entreprise (je l'ai grandement simplifié le retour, par souci de concision):

class BusinessType 
    def revenue(market=nil) 
    if market.nil? 
     return self.deals.sum('price') 
    else 
     return self.deals(:conditions => ['market_id = ?',market]).sum('price') 
    end 
    end 
end 

donc, si je fais quelque chose comme:

puts BusinessType.first.revenue 

J'obtiens le résultat attendu, c'est-à-dire la somme du prix de toutes les affaires associées à ce type d'entreprise. Cependant, quand je fais ceci:

puts BusinessType.first.revenue(1) 

Il retourne encore le prix de la somme de toutes les transactions, pas le prix de la somme de toutes les transactions de marché 1. J'ai aussi essayé:

puts BusinessType.first.revenue(market=1) 

également avec pas de chance.

Qu'est-ce qui me manque?

Merci!

Répondre

3

Essayez ceci:

class BusinessType 
    def revenue(market=nil) 
    if market.nil? 
     return self.deals.all.sum(&:price) 
    else 
     return self.deals.find(:all, :conditions => ['market_id = ?',market]).sum(&:price) 
    end 
    end 
end 

Cela devrait travailler pour vous, ou du moins il a fait pour quelques tests de base que je l'ai fait en premier. Comme je l'ai compris, c'est parce que la méthode sum appelée est sur enumerable, pas la méthode sum de ActiveRecord comme vous pouvez vous y attendre.

Note: Je viens de regarder un peu plus loin, et je remarquai que vous pouvez toujours utiliser votre ancien code avec un tweak plus petit que celui que je note:

class BusinessType 
    def revenue(market=nil) 
    if market.nil? 
     return self.deals.sum('price') 
    else 
     return self.deals.sum('price', :conditions => ['market_id = ?', market]) 
    end 
    end 
end 
Questions connexes