Ruby on Rails: Получить все сущности, которые имеют нулевое вхождение для конкретной ассоциации и условия - PullRequest
1 голос
/ 14 февраля 2011

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

Есть идеи?

1 Ответ

0 голосов
/ 14 февраля 2011

Если я правильно понимаю, Вы хотите вернуть все велосипеды, которые не имеют статуса 'BIKE_RENTAL_OUT' в велосипедах, связанных с таблицей has_may bike_rentals. Это должно быть в состоянии примерно так:

named_scope :not_rented, :joins => :bike_rentals, :conditions => [ "bike_rentals.status != ?", BIKE_RENTAL_OUT]

Надеюсь, это поможет

...