2013-07-02 45 views
0

我一直在爲我的服務製作一個搜索頁面,它包含了幾個基於關聯的搜索參數,我可以想到一些凌亂的長SQL混亂,但是會更喜歡一些清潔方法,作爲樣本,Rails查詢包含關聯關係計數,最好使用範圍

class Person < ActiveRecord::Base 
    has_many :friends 
end 

朋友具有指示友誼的狀態的屬性,像friend_type

class Friend < ActiveRecord::Base 
    belongs_to :person 
end 

搜索表單將包括許多參數的東西,他們兩個人是尋找比交流更多的人某些朋友,以及有多少人擁有friend_type設置爲「bff」的朋友。

我想什麼做的是在模型的一些範圍的方法,並在控制器能夠做到這一點,

的人一些像這樣的模型範圍,

scope :by_friends_count_greater_than, lambda { |value| joins(:friends).where(#count friends#, value) if value } 
scope :by_bff_count_greater_than, lambda { |value| joins(:friends).where(##count friends with bff status## , value) if value } 

和呼叫他們在控制器等等,

@people = Person.by_friends_count_greater_than(params[:query][:friends_count]) 
       .by_bff_count_greater_than(params[:query][:bff_count]) 

我一直在嘗試squeel,這似乎是一個很不錯的資產,認爲它可以調用查詢方法。是否有可能以這種方式完成搜索查詢?

如果有更好的方法來解決這個問題,那將非常感激。

回答

0

您可能對counter_cache感興趣,以獲得更簡單的查詢。

它會自動增加計數器到每個人模型。

http://railscasts.com/episodes/23-counter-cache-column

你有一個FRIENDS_COUNT列添加到您的Person模型

,並在belongs_to的

class Friend < ActiveRecord::Base 
    belongs_to :person, counter_cache: true 
end 
+0

這是我沒有想過的方式指定counter_cache,謝謝你建議。它可以處理普通朋友的計數,但如果我正確理解計數器緩存,則無法計算具有爲其設置的特定屬性的朋友。 – Saifis

+0

不,但計數器緩存工作的方式也可以手工製作以進行高效查詢。如果需要的話 – yannick