2012-12-12 34 views
0

有沒有在我的範圍或我的班級方法中使用模型方法的方法?在範圍或類方法內使用模型方法?

我有我的接觸類這兩種方法,確定聯繫人是否活躍

def active 
return no_of_activities_last_year > 0 ? true : false 
end 


def no_of_activities_last_year 
    time_range = (Time.now - 1.year)..Time.now 
    activities.where(:updated_at => time_range).count 
end 

然後我想能夠通過任何範圍或一個類的方法來返回所有積極的聯繫,這樣的事情:

scope :active_contacts, lambda {where(:active => true)} 

def self.active_contacts 
where(:active => true) 
end 

但他們鴕鳥政策,因爲ACTI工作ve不是數據庫的一部分。

有沒有一些聰明的方法我可以來這?最好能夠與其他示波器結合使用?

+0

你不能給出條件,除非'active'是該表的一列。 – VenkatK

回答

0

只要我知道,就沒有。 ActiveRecord背後的全部想法是對數據庫進行查詢。你不能告訴數據庫「讓我所有的這些ruby代碼邏輯爲真的記錄」,但是你可以告訴數據庫「按照這個標準讓我所有的記錄」。

所以,你仍然可以使用一個內部的選擇爲,有可能是更好的方法,但你可以這樣做:

raw_data = User.connection.execute("select user_id from (SELECT count(*) as qty, user_id FROM activities f2 WHERE user_id is not null AND created_at > DATE_SUB(NOW(), INTERVAL 1 WEEK) GROUP BY user_id HAVING qty > 1) as f1") 
User.where("id in (?)", raw_data.to_a.flatten) 

它不是最乾淨的解決方案,但它的快速,它會給你怎樣的想法構建其他查詢。

如果您不想編寫原始sql,並且想要以正確的方式執行此操作,則始終可以瞭解Arel或使用Squeel。

或者,您可以獲取所有數據,然後通過ruby代碼進行過濾,但與使sql引擎過濾結果相比,這將是低效的。