2011-06-23 52 views
2

你能告訴我,如果有更好的方法。這是否高效?

型號:

class Skill 
    has_many :tags 
    has_many :positions 
end 


class Tag 
    belongs_to :skill 
    has_and_belongs_to_many :positions 
end 


class Position 
    belongs_to :skill 
    has_and_belongs_to_many :tags 
end 

我想列出所有的技能和他們的位置的標籤。就像這樣:

skill - tag tag tag tag 
skill - tag tag 
... 

我設法acheive這樣的:

<% @skills.each do |skill| %> 
    <%= skill.name %> 
    <% skill.positions.collect{|p| p.tags}.flatten.uniq.each do |t| %> 
    <%= t.name %> 
    <% end %> 
<% end %> 

而且我skills_controller:

def index 
    @skills = Skill.all 
end 

這是正確的方式?

+1

看起來沒問題。它效率低下嗎?你看到某種表現受到打擊?有沒有你想加快的特定部分? – jefflunt

+0

描述性標題爲+1。 – 2011-06-23 20:44:35

+0

我不知道,我是初學者:)我只是想知道是否有更好的方法來編寫代碼。 –

回答

1

由於標記是一個非常常見的問題,我建議您看看acts-as-taggable-on,這是一個廣泛使用的,非常好的向任何Rails模型添加標籤的gem。

無論如何,你的模型看起來不錯(除了has_and_belongs_to_many往往回避贊成has_many :through),但我在這裏看到的改進空間:

<% skill.positions.collect{|p| p.tags}.flatten.uniq.each do |t| %> 
    <%= t.name %> 
<% end %> 

首先,這是一個很大的業務邏輯來放入你的視野。您應該在控制器中執行此操作。其次,這將是更高性能的周圍做它的其他方式:

@tags = Tag.all :conditions => [ "tag.id IN (?)", skill.positions.map &:id ] 

有更有效的方式還是要做到這一點,但是這應該給你一個想法。

0

首先 - 對於任何性能問題,您應該測量性能。按照您期望在佣金任務中所需的技能,標籤和職位創建兩倍的技能。然後測量頁面加載時間。如果他們可以滿足你的需求,很酷。否則,請繼續閱讀。

這不是特別有效,因爲您將通過網絡訪問數據庫,獲取每種技能的位置映射,然後再爲每個位置標記映射。您可以使用includes方法使用更少的查詢來加載 - 請參閱the Rails guide on querying

+0

感謝您的建議。我會看看包含和連接。 –