Я использую Rails 2.3.8
У меня есть две модели, которые представляют велосипеды и аренду велосипедов соответственно.Один велосипед может иметь много прокатов, но не более одного «активного» проката.Я выделяю активные аренды с полем состояния в таблице bike_rentals со значением BIKE_RENTAL_OUT
(с двумя другими возможными значениями: BIKE_RENTAL_RETURNED
и BIKE_RENTAL_INCIDENT
)
Чтобы создать новую аренду, которую я хочу представить пользователюсписок всех велосипедов, которые в настоящее время не арендованы, то есть все велосипеды, у которых нет «активной» аренды (ноль вхождений в ассоциации с определенным условием).
Я нашел решение, использующее именованныйобласть видимости, как показано ниже:
class Bike < ActiveRecord::Base
has_many :bike_rentals
named_scope :not_rented,
:conditions => "bikes.id NOT IN " +
"(SELECT bike_id FROM bike_rentals " +
"WHERE bike_rentals.status = 'BIKE_RENTAL_OUT')"
end
class BikeRental < ActiveRecord::Base
belongs_to :bike
end
и в контроллере я получаю этот список следующим образом:
@bikes = Bike.not_rented.find(:all, :order => 'chasis_number')
Код выше работает, но у меня сложилось впечатление, что это должно быть лучшее решениеили более «рельсовое» решение для этой (предполагаемой общей) проблемы.
Я знаю, что мог бы использовать счетчик кэша для количества «активных» прокатов, которые есть у велосипеда, но это кажется слишком сложным решениемдля задания просто выбора всех не «активных» прокатов, которые в большинстве случаев будут приносить 1 балл за велосипед.
Есть идеи?