Я использую Рельсы 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 на велосипед.
Любые идеи?