2013-07-25 2 views
0

Я пытаюсь выяснить, как создать определенный запрос, используя ActiveRecord.Rails: запрос ActiveRecord относительно размера ассоциации

У меня есть следующие модели

class Activity < ActiveRecord::Base 
    attr_accessible :limit, ...  
    has_many :employees 
end 

class User < ActiveRecord::Base 
    belongs_to :activity 
end 

Каждое действие имеет предел, то есть, целое число атрибут, содержащий максимальное количество пользователей, которые могут принадлежать к нему.

Я ищу способ выбора всех видов деятельности, в которых есть доступные места, то есть где количество пользователей меньше этого предела.

Любые идеи?

Благодаря

ответ

2

Я думаю, что синтаксис SQL стремиться будет:

select * 
from activities 
where activities.limit > (
     select count(*) 
     from users 
     where users.activity_id = activities.id) 

В Rails-говорить ...

Activity.where("activities.limit > (select count(*) from users where users.activity_id = activities.id)") 

Не уверен, является ли столбец имя «предел» будет давать вам проблемы, поскольку это зарезервированное слово. Возможно, вам придется процитировать его в SQL.

Я бы также серьезно рассмотрел счетчик кеша для пользователей в таблице действий, что сделало бы это намного лучше. Некоторые базы данных будут поддерживать частичный индекс только для тех строк, где ограничение счетчика пользователей < ограничено.

+0

Спасибо, это сработало! Вы правы в столбце limit, а счетчик-кеш - хороший способ упростить это. – hananamar

1
Activity.all.select{|activity| activity.users.length < activity.limit } 
+0

Это может стать чрезвычайно дорогим, если есть много мероприятий. Загрузка объектов ActiveRecord является одной из самых дорогих вещей в приложении Rails! – Woahdae

Смежные вопросы