Хорошо, я предполагаю, что вы хотите найти доступные удобства - те, которые не забронированы.
Я бы предложил использовать named_scope
вместо scope
, а также перенести его определение в класс Amenity
, если вы хотите найти доступные удобства.
Возможное решение - использовать именованную область со встроенным SQL-запросом:
class Amenity < ActiveRecord::Base
has_many :amenity_lists
named_scope :available, lambda {
|start_date, end_date| {
:select => 'amenities.*',
:order => 'id',
:conditions => ["
amenities.id NOT IN
(
SELECT aa.id from amenities aa, amenity_lists al WHERE
amenities.id = al.amenity_id AND
(
(? BETWEEN al.checkin AND al.checkout) OR
(? BETWEEN al.checkin AND al.checkout)
)
)",
start_date,
end_date
]
}
}
end
Просто обратите внимание, что в Ruby строки могут занимать несколько строк.
Теперь вы можете использовать данную именованную область видимости следующим образом:
start_date = ...
end_date = ...
available_amenities = Amenity.available(start_date, end_date)
Создает следующий запрос SQL:
SELECT amenities.* FROM "amenities"
WHERE (
amenities.id NOT IN
(
SELECT aa.id from amenities aa, amenity_lists al
WHERE
amenities.id = al.amenity_id AND
(
('2011-05-10 23:57:09' BETWEEN al.checkin AND al.checkout) OR
('2011-05-10 23:57:09' BETWEEN al.checkin AND al.checkout)
)
)
) ORDER BY id
Кроме того, если вы новичок в мире Rails, я настоятельно рекомендую вам посмотреть серию Райана Бейтса Railscasts . Эпизод 108 о named_scope
с. Посмотрев этот фильм, наберитесь терпения и начните с эпизода 1.:)