2013-07-25 64 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

謝謝,這工作!你對極限列是正確的,並且反高速緩存是簡化這一點的好方法。 – hananamar

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

如果有很多活動,這可能會非常昂貴。加載ActiveRecord對象是Rails應用程序中最昂貴的事情之一! – Woahdae