Rails 3 ActiveRecord связывает коллекции пользовательских методов - PullRequest
4 голосов
/ 18 октября 2010

Если у меня есть запись Аукциона, с которой связано много Ставок, из коробки я могу сделать что-то вроде:

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

Но если я хочу сделать это более понятным (поскольку он используется в нескольких областях кода), где бы я определил метод:

highest_bid = auction.bids.highest_bid

Возможно ли это на самом деле, или мне нужно перейти непосредственно к классу Bid?

highest_bid = Bid.highest_on(auction)

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

Извините, я понял это.Я пытался добавить метод в класс Bid ActiveRecord, но я забыл сделать его методом класса, чтобы он не видел метод.

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

Не на 100%, что это будет обрабатывать ассоциациютем не мение.Просто напишу несколько тестов для этого сейчас.

РЕДАКТИРОВАТЬ:

Быстрый тест, кажется, показывает, что это, кажется, магически обрабатывает ассоциации тоже.

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

Тест найдетставка 50 долларов, если она не ассоциировалась правильно.Вуду;)

1 голос
/ 18 октября 2010

Я думаю, вам нужно сделать highest_bid метод в вашей Auction модели.

class Auction < ActiveRecord::Base
  has_many :bids

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

highest_bid = auction.highest_bid
...