2010-10-18 34 views
4

Si j'ai un record d'enchères, qui a de nombreuses offres qui y sont associés, hors de la boîte, je peux faire des choses comme:Rails 3 ActiveRecord collections associées méthodes personnalisées

highest_bid = auction.bids.last(:all, :order => :amount) 

Mais si je veux que ce soit plus clair (car il est utilisé dans de nombreux domaines dans le code), où que je définir la méthode:

highest_bid = auction.bids.highest_bid 

Est-ce réellement possible ou dois-je descendre à regarder vers le haut de la classe des enchères directement?

highest_bid = Bid.highest_on(auction) 

Répondre

4

Désolé, j'ai compris. J'avais essayé d'ajouter la méthode à la classe ActiveRecord Bid, mais j'avais oublié d'en faire une méthode de classe donc elle ne voyait pas la méthode.

class Bid < ActiveRecord::Base 
    ... 
    def self.highest 
    last(:order => :amount) 
    end 

Pas 100% que cela va gérer l'association cependant. J'écris juste des tests pour ça maintenant.

EDIT:

Un test rapide semble montrer que cela semble gérer les associations comme par magie aussi.

test "highest bid finder associates with auction" do 
    auction1 = install_fixture :auction, :reserve => 10 
    auction2 = install_fixture :auction, :reserve => 10 

    install_fixture :bid, :auction => auction1, :amount => 20, :status => Bid::ACCEPTED 
    install_fixture :bid, :auction => auction1, :amount => 30, :status => Bid::ACCEPTED 
    install_fixture :bid, :auction => auction2, :amount => 50, :status => Bid::ACCEPTED 

    assert_equal 30, auction1.bids.highest.amount, "Highest bid should be $30" 
end 

Le test trouverait l'enchère de 50 $ s'il ne s'associait pas correctement. Voodoo;)

+0

Cela vous donnera l'enchère la plus élevée, indépendamment de la vente aux enchères. Si vous ajoutez la méthode au modèle Enchères, vous pouvez obtenir l'enchère la plus élevée par enchère. – Mischa

+0

Je peux confirmer que cela semble correctement associé à la vente aux enchères lorsqu'elle est invoquée via auction.bids. – d11wtq

+0

Selon mes tests, vous avez tort: ​​ – d11wtq

1

Je pense que vous auriez à faire une méthode highest_bid dans votre modèle Auction.

class Auction < ActiveRecord::Base 
    has_many :bids 

    def highest_bid 
    bids.last(:all, :order => :amount) 
    end 
end 

highest_bid = auction.highest_bid